javascript - 将 Javascript getter/setter 复制到另一个原型(prototype)对象

标签 javascript setter getter prototype-programming extending

// 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/

相关文章:

javascript - 将 cellUpdateEvent 与 YUI 数据表和 JSON 数据源一起使用

kotlin - Kotlin 中的 Setter 重载

c++ - 如何过早销毁智能指针

javascript - KnockoutJS 自定义数据绑定(bind)以添加移动样式

javascript - 在 Angular Controller 上使用 notification.js

javascript - 如何在用户离开页面时停止播放音乐

java - 如何 stub 获取/设置简单类型

java - getter 和 setter 并增加一个变量

caching - Swift getter 代码重复

java - 如何测试 Java getter 方法