首页 > 关于prototype和constructor一些疑问

关于prototype和constructor一些疑问

function person (){

}
person.prototype.each = function(){

}

prototype是一个对象,构造函数里面的prototype的属性指向这个对象;既然prototype在构造函数外面是一个对象,小弟不明白为什么person能点对象呢;

就像下面的错误例子一样,a不能点上b;

var a = funciton(){    //a对象
}
var b ;               //b对象

a.b            //a不能这样点b然后进行赋值吧

constructor

function person (){
}
var p =  new person();

var s = p.constructor + "";
console.log(s)    //结果:person 
constructor不是存在于person.prototype.constructor的prototype对象中吗?

为什么new出来的p也能访问这个属性;


var Person = function(){}的时候,同时也创造了一个Person.prototype所有的公有方法都在Person.prototype里,Person.prototype有constructor属性,指向Person。可以添加像Person.prototype.legs = 4这样的属性。这样的属性和方法可以被任何一个var person1 = new Person()使用到。而person1.name = "Tom"只能被person1使用。


你要先了解所谓的原型化继承,prototypal inheritance,这是JavaScript区别于绝大多数主流语言的地方;


这个就是 javascript 的原型链呀
var p = new persion 的时候,其实编译器做了这么几件事情:

  1. 创建一个 person 类的对象,假设叫 t

  2. t.__proto__ = person.prototype

  3. 以 t 作为 this 调用函数 persion,设其返回值是 r

  4. p = r instanceof Object? r:t

当读取(只是读取),一个对象的属性的时候,比如 p.each 其实会首先查找 p 下有没有这个属性,如果没有就查找 p.__proto__,然后p.__proto__.__proto__ ... 所以 由于 p.__proto__ == p.prototype 所以 p 可以访问 each。

PS:__proto__ 这个属性只在比较新的浏览器中存在,ES标准中规定的是这是一个内部属性叫做[[prototype]],所以尽量不要用这个属性。

【热门文章】
【热门文章】