function Person(name){//形参用来接受实例传过来的实参
this.name = name;
}
Person.prototype.showName = function (){
console.log(this.name);//person1打印hello person2打印world
}
var person1 = new Person('hello');
person1.showName();
var person2 = new Person('world');
person2.showName();
复制代码
- 函数名首字母大写
function Person(){}
- 这是为了区别于普通的函数,构造函数自己其实就是普通的函数,只是咱们专门用它来实现了构造的功能,因此专门起了一个名字叫构造函数,任何函数均可以成为构造函数,这取决于你调用函数的方式,当使用了New的方式调用就成了构造函数。
- 当用New去调用一个函数的时候,this的指向会不同。
- 每new一次,系统都会新建立一个内存,这两个对象各自有各自的内存空间,但他们具备相同的功能,还不共用。
- showName()方法是共享的,也就是说他们共用一个内存,更进一步的说它们存在引用关系。
- 因此咱们能够把能够共享复用的方法放在函数的
prototype
上,不想共享的能够经过构造函数new
来调用。
prototype
1.每一个函数都有一个
prototype
属性,他被称为原型对象;javascript
- 咱们能够经过
Person.prototype.showName
把方法和属性写在它上面;
- 而经过
var person = new Person('hello')
这个函数建立出来的实例对象,都能共享这个原型对象下的方法和属性;
_proto_
- 每一个实例化对象都有
_proto_
属性,它是一个指针,指向函数的prototype
,也就是保存了它的地址。有了地址就能找到对象。
- 调用
person2.__proto__
属性,保存了构造函数的原型对象的地址,经过这个属性就能够拥有原型对象下的全部属性和方法,_proto_
属性实际就是实例化对象和原型对象之间的链接
- 全部的函数都有
prototype
属性,它指向原型对象;prototype
是一个对象,浏览器默认给他开辟堆内存
- 每个函数的原型对象都有的默认属性
constructor
指向当前类的自己
- 每个实例(对象),都有一个
__proto__
属性,指向所属类的原型
Person.prototype == person1.__proto__ //true
Person.prototype.constructor == person1.__proto__.constructor //true
Person.prototype.constructor.__proto__ == person1.__proto__.constructor.__proto__ //yrue
Person.prototype.__proto__ == Object.prototype //true
Person.prototype.__proto__ == Function.prototype.__proto__ //true
Function.prototype.__proto__ == Object.prototype //true
复制代码