代码
function Person(){
}
Person.prototype.name = 'Nicholas';
Person.prototype.age = 29;
Person.prototype.job = 'Software Engineer';
Person.prototype.sayName = function(){
console.log(this.name);
};
var p1 = new Person();
p1.sayName();//Nicholas
var p2 = new Person();
p2.sayName();//Nicholas
console.log(p1.sayName == p2.sayName);//true
复制代码
相关概念
1).无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象:Person.prototype
2).在默认情况下,所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性是一个指向prototype属性所在函数的指针:console.log(Person.prototype.constructor == Person);//true
3).当调用构造函数创建了一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象,这个指针叫做[[Prototype]],在脚本中没有标准的方式访问[[Prototype]],但是Firefox、Safari、Chrome在每个对象上都支持一个属性__proto__:
console.log(p1.__proto__==Person.prototype);//true
4)实例都有一个constructor(构造函数)属性,该属性指向Person:console.log(p1.constructor == Person);//true
一些方法
- isPrototypeOf():可以用来确定对象之间是否存在[[prototype]]关系
console.log(Person.prototype.isPrototypeOf(p1));//true console.log(Person.prototype.isPrototypeOf(p2));//true 复制代码
- Object.getPrototypeOf():ECMAScript5新增的方法,返回[[prototype]]的值
console.log(Object.getPrototypeOf(p1) == Person.prototype);//true console.log(Object.getPrototypeOf(p1).name);//Nicholas 复制代码
- hasOwnProperty():可以检测一个属性是存在实例中,还是存在原型中。当给定的属性存在于实例中返回true
console.log(p1.name);//'Nicholas' console.log(p1.hasOwnProperty('name');//false p1.name = 'John'; console.log(p1.name);//'John' console.log(p1.hasOwnProperty('name');//true 复制代码
- in:单独使用或者在for-in中使用。单独使用时,通过对象能 访问到给定的属性时返回true,无论该属性存在于原型还是实例中。
console.log('name' in p1);//true console.log('fun' in p1);//false 复制代码
- Object.keys():得到实例上所有可以枚举的属性(不包含原型上的属性)。
p1.like = 'food'; Object.keys(p1);//['like'] 复制代码
- Object.getOwnPropertyNames():得到实例的所有属性,无论是否可以枚举(不包含原型上的属性)。
分析:原型中所以的属性都被很多的实例共享,这种共享对于函数非常合适。但是对于包含引用类型值的属性来说,数据也被共享了,如:Object.defineProperty(p1, "key", { enumerable: false, configurable: false, writable: false, value: "static" }); Object.keys(p1);//[] Object.getOwnPropertyNames(p1);//['key'] 复制代码
Person.prototype.arr = [1,2,3]; p1.arr.push(4); console.log(p1.arr);//[1,2,3,4] console.log(p2.arr);//[1,2,3,4] 复制代码