将Javascript getters / setters复制到另一个原型对象

// 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()相同的结果,但正如您所看到的,它返回的是未定义的。 显然,getter没有找到父范围作为子实例(mySub),而是一个不存在的Base实例。

除了必须将相同的吸气器分配到新的原型之外,还有其他解决方法吗?


Sub.prototype.__defineGetter__('value', Base.prototype.__lookupGetter__('value'));

试试看。


我认为如果你分配的话,它会起作用

Sub.prototype = new Base()

问题是,直接从Base.prototype.value分配构造函数时,构造函数永远不会运行。 直到你有一个Base类的实例(通过new ),这个值才会存在,

这是我扩展Function实现继承的典型方法:

Function.prototype.Extend = function(superClass) {
    this.prototype = new superClass();

    this.prototype.getSuperClass = function() {
        return superClass;
    };
    this.getSuperClass = this.prototype.getSuperClass;
    return this;
};

这将正确地将所有父类的方法和属性分配给子类'class'。

用法看起来像

var Sub = function() {}
Sub.Extend(Base)

更现代的解决方案是使用Object.defineProperty因为它允许getter和setter被处理而不会被破坏。

唯一的问题是,它需要一个描述符对象,而不是手动使用Object.getOwnPropertyDescriptor函数来为您获取它。

var BazValue = Object.getOwnPropertyDescriptor(Base.prototype,'value');

Object.defineProperty(Sub.prototype,'value',BazValue);
链接地址: http://www.djcxy.com/p/30055.html

上一篇: Copying Javascript getters/setters to another prototype object

下一篇: javascript prototype inheritance