2017-04-21 118 views
1

我有继承下面的代码:如何在子类中定义getter和setter属性

SubClass= function() { 
    ParentClass.call(this); 
} 
SubClass.prototype = Object.create(ParentClass.prototype); 
SubClass.prototype.constructor = SubClass; 

不过,我想定义在子类中的某些属性,以及:

SubClass.prototype = { 

    get x() { 
     return this.newX; 
    }, 
    set x(val) { 
     this.newX = val; 
     alert("X has a value of " + this.newX); 
    } 
} 

的我遇到的问题是将两者结合起来。换句话说,第一个代码示例中,我说:

SubClass.prototype = Object.create(ParentClass.prototype); 

但随后的第二个代码示例中,我说:

SubClass.prototype = {... 

如何能够做到两者兼而有之?什么语法可以让我从父类继承并使用相同的原型定义来定义属性?

谢谢:)

回答

1

定义您的属性通过传递一个属性描述符Object.defineProperty

Object.defineProperty(SubClass.prototype, 'x', { 
    configurable: true, 
    get: function() { 
     return this.newX; 
    }, 
    set: function (val) { 
     this.newX = val; 
     alert("X has a value of " + this.newX); 
    }, 
}); 

也有可能包含属性描述的对象传递给Object.create

function SubClass() { 
    ParentClass.call(this); 
} 

SubClass.prototype = Object.create(ParentClass.prototype, { 
    constructor: { 
     configurable: true, 
     writable: true, 
     value: SubClass, 
    }, 
    x: { 
     configurable: true, 
     get: function() { 
      return this.newX; 
     }, 
     set: function (val) { 
      this.newX = val; 
      alert("X has a value of " + this.newX); 
     }, 
    } 
}); 

如果您可以使用ES6课程,ES6课程更好:

class SubClass extends ParentClass { 
    get x() { 
     return this.newX; 
    } 

    set x(val) { 
     this.newX = val; 
     alert("X has a value of " + this.newX); 
    } 
} 

您也可以让这种有用的功能:

function extend(target, source) { 
    Object.getOwnPropertyNames(source).forEach(function (name) { 
     var descriptor = Object.getOwnPropertyDescriptor(source, name); 
     Object.defineProperty(target, name, descriptor); 
    }); 
} 

,并使用它,像这样:

extend(SubClass.prototype, { 
    get x() { 
     return this.newX; 
    }, 
    set x(val) { 
     this.newX = val; 
     alert("X has a value of " + this.newX); 
    }, 
}); 
+0

这是一个很大的帮助信息。非常感谢你!!! –

相关问题