搜尋

首頁  >  問答  >  主體

javascript - js 中更改原型链

我建了两个函数对象,然后 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
PHPzPHPz2820 天前430

全部回覆(4)我來回復

  • PHP中文网

    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);
    

    回覆
    0
  • 黄舟

    黄舟2017-04-10 15:11:20

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

    回覆
    0
  • 大家讲道理

    大家讲道理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 中沒有繼承也不需要繼承,也很難實現真的繼承。繼承是靜態的,原型是動態的。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:11:20

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

    回覆
    0
  • 取消回覆