我建了两个函数对象,然后 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
PHP中文网2017-04-10 15:11:20
首先应该是 k.prototype
...原型链的继承都是基本都是发生在构造函数上的,所以在实例上进行继承有点不靠谱。你这么写是没有问题的:
m.prototype = new n;
m.prototype.constructor = m;
k = new m;
console.log(k.gate);
或者你也可以用简单点的办法:
var m = function(){
n.apply(this, [].slice.call(arguments));
this.person = "Life";
}
k = new m;
console.log(k.gate);
黄舟2017-04-10 15:11:20
同意一楼的方法。继承的时候,通过构造函数的原型对象重新指定这样的继承方式会比较好一些。
如果楼主一定要在实例对象上继承的话,对象的[[prototype]]属性应该写成:__proto__
,注意有两条下划线,而不是一条。楼主题中写成一条了。
大家讲道理2017-04-10 15:11:20
幫你整理下代碼之後運行成功。
這是 js 比較坑的地方——__proto__
是左右各兩個下劃線,但從視覺上無從分辨是幾個,所以樓主用一個下劃線就沒用了。
另外公子的答案有大量錯誤
1 公子混淆了 __proto__
和 prototype
,前者是原型,後者是原型對象,前者屬於對象,後者屬於函數。
2 其次,答非所問,題主問得是更改原型鏈,不是更改原型對象,更改原型鏈當然要用 __proto__
或 Object.setPrototype
(es6)。
3 apply
的第二個參數是 An array-like object 而不必是 array,所以公子的寫法暴露了他對 js 的不熟悉。
4 公子混淆了繼承和原型的概念。js 中沒有繼承也不需要繼承,也很難實現真的繼承。繼承是靜態的,原型是動態的。