我建了两个函数对象,然后 new
,我想修改 k
的原型链到 n
上去,可是不成功,当 k
中没有该属性的时候,它就应该去查找 __proto__
发现 prototype
是 m
,可是我已经把 k
的原型链修改至 n
上了啊,我查过手册,这个不是只读的。
var M = function() {
this.person = "life"
},
N = function() {
this.gate = "ok"
};
var k = new M(),
l = new N();
k.__proto__ = l;
console.log(k.gate);
// → ok
首先应该是
k.prototype
...原型链的继承都是基本都是发生在构造函数上的,所以在实例上进行继承有点不靠谱。你这么写是没有问题的:或者你也可以用简单点的办法:
同意一楼的方法。继承的时候,通过构造函数的原型对象重新指定这样的继承方式会比较好一些。
如果楼主一定要在实例对象上继承的话,对象的[[prototype]]属性应该写成:
__proto__
,注意有两条下划线,而不是一条。楼主题中写成一条了。幫你整理下代碼之後運行成功。
這是 js 比較坑的地方——
__proto__
是左右各兩個下劃線,但從視覺上無從分辨是幾個,所以樓主用一個下劃線就沒用了。另外公子的答案有大量錯誤
1 公子混淆了
__proto__
和prototype
,前者是原型,後者是原型對象,前者屬於對象,後者屬於函數。2 其次,答非所問,題主問得是更改原型鏈,不是更改原型對象,更改原型鏈當然要用
__proto__
或Object.setPrototype
(es6)。3
apply
的第二個參數是 An array-like object 而不必是 array,所以公子的寫法暴露了他對 js 的不熟悉。4 公子混淆了繼承和原型的概念。js 中沒有繼承也不需要繼承,也很難實現真的繼承。繼承是靜態的,原型是動態的。
没有为原型对象上定义属性或者方法呀~?