在javascript中,this是创建时定义的。 这句话什么意思呢?
function Foo() {
this.name ='Peter';
}
foo();
console.log(name);//this在创建时是指全局对象,所以这里的name就是Peter;
那么加个关键字new有什么不同呢?
比方说varobj = new Foo();
在javascript中,new关键词干了三件事情:
一、生成一个新对象
一、varo = {}; //生成一个空对象o
二、o.__proto__= Foo.prototype;//把原型链传过去给o
三、Foo.call(o);//把自身的值也传过去
return o;
这时候
new Foo();
console.log(name); // name is not defined
什么是prototype的继承呢?参见阮一峰的文章
var F = function () {};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
由于对象是按引用传递的,那么当我赋值F.prototype= Parent.prototype,然后F.prototype.xx= 'sth'; 这时候原来的Parent.prototype就会相应的被改变,所以要用空对象作为中介。
加上我们对new的定义,可以得到:
var F = function () {};
F.prototype = Parent.prototype;
var o = {};
o.__proto__ = F.prototype;
F.call(o);
Child.prototype = o;
Child.prototype.constructor = Child;
由于我们把一个对象赋值给Child.prototype,当我们给Child更改constructor属性时,我们改变的只是对象o的一个属性,不是一个o的prototype。所以对原来的Parent没影响。
不信?
试试
console.log(o.prototype === o.__proto__); //false
原型链是先找自身属性,然后找prototype,然后继续往上找!
var o = {};
var k = {
call : function(){
console.log('first try');
}
};
k.__proto__.call = function () {
console.log('second try');
};
o.__proto__ = k;
o.call();