一、原型对象
JS中,函数都有原型,名称叫prototype。在面向对象中,构造函数也不例外。
prototype的类型是object,也是对象,所以原型也叫原型对象。
function Person(){
};
console.log(Person.prototype); //object
// 实例的__proto__指针
var p1 = new Person(); // __proto__指向Person.prototype
var p2 = new Person();// __proto__指向Person.prototype
//isPrototype判断属于哪一个原型对象
Person.prototype.isPrototypeOf(p1); // true
Person.prototype.isPrototypeOf(p2); // true
//constructor
console.log(p1.constructor); // function a(){}
console.log(Person.prototype.constructor); // function a(){}
__proto__指针:类实例化之后的对象中有一个__proto__指针,这个指针指向原型对象。
isPrototypeOf():判断是否为某一个原型对象。如Person.prototype.isPrototypeOf(p1); // true
constructor:实例中的constructor指向构造函数,原型中的constructor指向构造函数;
二、原型属性与自有属性
function Person(){
};
Person.prototype.name="张三";
var p1 = new Person();
var p2 = new Person();
p1.name="李四"; // 自有属性,覆盖原型属性
console.log(p1.name); //李四
console.log(p2.name); // 张三
p1.hasOwnProperty('name'); //true
p2.hasOwnProperty('name'); //false
实例可以覆盖自有属性,判断是否自有属性使用hasOwnProperty
三、in操作符与for....in、Object.keys()
in操作符:key in object //返回boolean,包含自有属性与prototype属性;
for...in:枚举对象中的属性,包含自有属性与prototype属性;
Object.keys返回客枚举的字符串数组;
四、原型重写
原型重写指的是直接修改prototype的指向,指向新的对象。
原型重写之后,constructor指向必须重新指向构造函数。
五、原型的动态性
原型可随时增加新属性、新方法,并且变更可以在实例中体现出来,而不需要重新新建实例。