首先说说我最近遇到的神奇代码:
Function.prototype.a="a";
Object.prototype.b="b";
function Person(){}
var p=new Person();
console.log("Person.a:"+Person.a+" Person.b:"+Person.b);//Person.a:a Person.b:b
console.log("p.a:"+p.a+" p.b:"+p.b);//p.a:undefined p.b:b
让我们先从构造函数开始吧!
构造函数是怎么构建一个实例对象的呢?这里我放上大神的代码,
构造函数的四个步骤:
var obj ={};//创建一个对象
obj.__proto__ = CO.prototype;//obj对象的隐式原型指向构造函数的原型(为什么说隐式原型呢,因为只有函数才有prototype属性)
CO.call(obj);//将构造函数作用域赋值给obj对象
return obj;//将obj对象返回
解释上面部分代码(var p=new Person()):就是创建了一个具有Person作用域的对象p,此时p的隐式原型指向Person原型。
往下面走,先分析为什么Person.a=”a”和Person.b=”b”,首先function Person()其实就是创建了一个Function实例,所以Person.a=”a”,而Person.prototype是一个原型对象,是一个Object实例,所以Person.b=”b”;
而为什么p.a=undefined而p.b=”b”呢?如果上面构造函数的四个步骤可以懂,其实就很好理解了,首先,p是一个对象,是Object的一个实例,所以它拥有b属性,但是它并不是Function实例,所以不具备a属性。
如果有哪里解释不对的,望您指正。
网友评论