我实际上是在练习使用new
关键字创建类及其实例,而这一点在我脑海中浮现。
假设我有一个名为Customers
的超类,我有两个子类newCustomers
和specialCustomers
。
假设我有一个名为bob的新客户==> var bob = new newCustomer();
我有一个名为smith ==>>的特殊客户
var smith = new specialCustomer();
如何编写一个方法,当它被分配给bob时,它会将他从newCustomer实例转移到specialCustomer实例?
例如,我应编写什么代码才能使其工作:
bob.moveToSpecial() //moves bob from being instance of newCust to specialCust
答案 0 :(得分:1)
对象不是类的实例,对象具有基于名为的构造函数的原型。
你能做什么(虽然它可能导致副作用)正在改变那个对象的原型:
bob.__proto__ = specialCust.prototype;
在此处执行此操作时,请阅读警告:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
更好的方法是创建一个新对象并从那里移动所有属性:
newBob = new specialCust();
for(var prop in bob){
newBob[prop] = bob[prop];
}
请注意,在这两种情况下,bob都会丢失旧原型中的“继承”方法和属性,尽管在后一种情况下只有非可枚举的方法和属性(如评论中所述)。可枚举的将被复制并直接绑定到新对象,可能会覆盖继承的方法,所以也要注意这一点。
另外值得一读:https://reinteractive.com/posts/235-es6-classes-and-javascript-prototypes
[edit] Object.keys
的示例代码:
newBob = new specialCust();
Object.keys(bob).forEach(function(prop){
newBob[prop] = bob[prop];
});