我实际上是在练习使用new
关键字创建类和实例,这想到了我的想法。
假设我有一个叫Customers
的超类,并且我有两个子类别是newCustomers
和specialCustomers
。
假设我有一个名为bob ==> var bob = new newCustomer();
,我有一个名为Smith ==>>
的特殊客户var smith = new specialCustomer();
我如何编写一种方法,当分配给鲍勃时,它将他从一个新的customer实例转移到了一个specialcustomer实例?
?例如,我应该编写什么代码来完成此工作:
bob.moveToSpecial() //moves bob from being instance of newCust to specialCust
一个对象不是类的实例,一个对象具有基于构造函数的原型。
您可以做什么(尽管可能导致副作用)正在更改该对象的原型:
bob.__proto__ = specialCust.prototype;
在此处执行此操作时,请阅读有关警告:https://developer.mozilla.org/de/docs/web/javascript/reference/reference/global_objects/objects/object/proto
更好的方法是创建一个新对象并从鲍勃那里移动所有属性:
newBob = new specialCust();
for(var prop in bob){
newBob[prop] = bob[prop];
}
请注意,在这两种情况下,鲍勃都从旧原型中失去了他的"继承"方法和属性,尽管在后一种情况下,只有一种不可衡量的情况(如评论中所述)。枚举的方法将直接复制并绑定到新对象,可能是覆盖的继承方法,因此也要意识到这一点。
也值得阅读:https://reinteractive.com/posts/235-es6-classes-and-javascript-protypes
[编辑]带有Object.keys
的示例代码:
newBob = new specialCust();
Object.keys(bob).forEach(function(prop){
newBob[prop] = bob[prop];
});