首页 文章

一个构造函数的属性是否可以由另一个构造函数继承?

提问于
浏览
2

使用javascript,您可以让一个对象从另一个对象继承属性,这样,如果在第一个对象上找不到属性,则会搜索第二个对象 . 通过在构造函数上重新分配 prototype 属性,可以创建许多对象的链以搜索属性 .

例如:

var X = function() {};
X.prototype.x = "x";

var Y = function() {};
Y.prototype = new X();
Y.prototype.y = "y";

var z = new Y();
z.z = "z";

///////////////

console.log(z.z); // searches z for property 'z', finds it and returns 'z'

console.log(z.y); // searches z, fails, searches z.[[hidden_prototype]] 
                  // (which is Y.prototype), finds it and returns 'y'

console.log(z.x); // searches z, fails, searches Y.prototype, fails, 
                  // searches Y.prototype.[[hidden_prototype]]
                  // (which is X.prototype), finds it and returns "x"

我想知道是否可以将其扩展到构造函数的属性,即上面代码中的 XY . 例如,有没有办法改变上面的代码,以便以下代码也可以工作:

X.val = 42;

console.log(Y.val); // returns 42

如果 Y.[[hidden_prototype]] === X ,这将有效,但我不知道如何设置 XY 也必须是构造函数 .

2 回答

  • 1

    根据第一个相关link

    你可以这样做:

    function Y(){}
    function X(){}
    Y.__proto__=X;
    X.val=42;
    console.log(Y.val);//42
    

    虽然它显然不标准

  • 0

    您可以使用由Lasse Reichstein Nielson开发并由Douglas Crockford推广为“beget”的克隆函数:

    var clone = (function() {
      var f = function(){};
      return function(obj) {
        f.prototype = obj;
        return new f();
      }
    }());
    

    要将X设置为Y [[Prototype]]:

    function X(){}
    var Y = clone(X);
    

    但是Y将是一个对象,而不是一个函数 . 函数只能由Function构造函数创建 . 如何创建新函数在ECMA-262中定义,你不能影响它用作[[Prototype]]对象的对象,因为函数必须从Function.prototype和Object.prototype继承,所以它不能允许任何要作为[[Prototype]]插入的对象 .

相关问题