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
的时候,其实编译器做了这么几件事情:
创建一个 person 类的对象,假设叫
t
t.__proto__ = person.prototype
以 t 作为 this 调用函数 persion,设其返回值是 r
p = r instanceof Object? r:t
当读取(只是读取),一个对象的属性的时候,比如 p.each
其实会首先查找 p 下有没有这个属性,如果没有就查找 p.__proto__
,然后p.__proto__.__proto__
... 所以 由于 p.__proto__ == p.prototype
所以 p 可以访问 each。
PS:__proto__
这个属性只在比较新的浏览器中存在,ES标准中规定的是这是一个内部属性叫做[[prototype]]
,所以尽量不要用这个属性。