javascript - js 中更改原型链
PHPz
PHPz 2017-04-10 15:09:20
0
4
433

我建了两个函数对象,然后 new,我想修改 k 的原型链到 n 上去,可是不成功,当 k 中没有该属性的时候,它就应该去查找 __proto__ 发现 prototypem,可是我已经把 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
PHPz
PHPz

学习是最好的投资!

reply all(4)
Ty80

首先应该是 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);
黄舟

同意一楼的方法。继承的时候,通过构造函数的原型对象重新指定这样的继承方式会比较好一些。
如果楼主一定要在实例对象上继承的话,对象的[[prototype]]属性应该写成:__proto__,注意有两条下划线,而不是一条。楼主题中写成一条了。

大家讲道理

幫你整理下代碼之後運行成功。

這是 js 比較坑的地方——__proto__ 是左右各兩個下劃線,但從視覺上無從分辨是幾個,所以樓主用一個下劃線就沒用了。

另外公子的答案有大量錯誤

1 公子混淆了 __proto__prototype,前者是原型,後者是原型對象,前者屬於對象,後者屬於函數。

2 其次,答非所問,題主問得是更改原型鏈,不是更改原型對象,更改原型鏈當然要用 __proto__Object.setPrototype(es6)。

3 apply 的第二個參數是 An array-like object 而不必是 array,所以公子的寫法暴露了他對 js 的不熟悉。

4 公子混淆了繼承和原型的概念。js 中沒有繼承也不需要繼承,也很難實現真的繼承。繼承是靜態的,原型是動態的。

伊谢尔伦

没有为原型对象上定义属性或者方法呀~?

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template