使用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"
我想知道是否可以将其扩展到构造函数的属性,即上面代码中的X
和Y
。例如,有没有办法改变上面的代码,以便以下代码也可以工作:
X.val = 42;
console.log(Y.val); // returns 42
如果Y.[[hidden_prototype]] === X
这会有效,但我不知道如何在X
和Y
也必须是构造函数时设置它。
答案 0 :(得分:1)
根据第一个相关的link
您可以执行以下操作:
function Y(){}
function X(){}
Y.__proto__=X;
X.val=42;
console.log(Y.val);//42
虽然它显然不标准
答案 1 :(得分:0)
你可以使用由Lasse Reichstein Nielson开发并由Douglas Crockford推广为“beget”的克隆函数:
var clone = (function() {
var f = function(){};
return function(obj) {
f.prototype = obj;
return new f();
}
}());
将X设为Y [[原型]]:
function X(){}
var Y = clone(X);
然而,Y将是一个对象,而不是一个函数。函数只能由Function构造函数创建。如何创建新函数在ECMA-262中定义,你不能影响它用作[[Prototype]]对象的对象,因为函数必须从Function.prototype和Object.prototype继承,所以它不能允许任何要作为[[Prototype]]插入的对象。