// Base class
var Base = function() {
this._value = 'base';
};
Base.prototype = {
constructor: Base,
// By function
getValue: function() {
return this._value;
},
// By getter
get value() {
return this._value;
}
};
// Sub class extends Base
var Sub = function() {
this._value = 'sub';
};
Sub.prototype = {
constructor: Sub
};
// Pass over methods
Sub.prototype.getValue = Base.prototype.getValue;
Sub.prototype.value = Base.prototype.value;
// ---
var mySub = new Sub();
alert(mySub.getValue()); // Returns 'sub'
alert(mySub.value); // Returns 'undefined'
乍一看,mySub.value 似乎应该返回与 mySub.getValue() 相同的值,但如您所见,它返回的是 undefined。显然,getter 并没有找到作为 Sub 实例 (mySub) 的父作用域,而是一个不存在的 Base 实例。
除了必须将相同的 getter 分配给新原型(prototype)之外,还有什么办法可以解决这个问题吗?
最佳答案
更现代的解决方案是使用 Object.defineProperty
,因为它允许在不破坏 getter 和 setter 的情况下处理它们。
唯一的问题是它需要一个描述符对象,因此与其手动创建一个,不如使用 Object.getOwnPropertyDescriptor
函数为您获取它。
var BazValue = Object.getOwnPropertyDescriptor(Base.prototype,'value');
Object.defineProperty(Sub.prototype, 'value', BazValue);
关于javascript - 将 Javascript getter/setter 复制到另一个原型(prototype)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6039676/