【问题标题】:A Way to move an instance to another class in javascript一种在javascript中将实例移动到另一个类的方法
【发布时间】:2017-03-11 21:44:59
【问题描述】:

我实际上是在练习使用 new 关键字创建类和它们的实例,我想到了这一点。

假设我有一个名为Customers 的超类,我有两个子类newCustomersspecialCustomers

假设我有一个新客户叫 bob ==> var bob = new newCustomer();

我有一个特殊的客户叫 smith ==>>

var smith = new specialCustomer();

我如何编写一个方法,当分配给 bob 时,它将他从一个 newCustomer 实例转移到一个 specialCustomer 实例?

例如,我应该编写什么代码来完成这项工作:

bob.moveToSpecial() //moves bob from being instance of newCust to specialCust

【问题讨论】:

    标签: javascript function class object instance


    【解决方案1】:

    对象不是类的实例,对象具有基于调用的构造函数的原型。

    您可以做的(尽管可能会导致副作用)是更改该对象的原型:

    bob.__proto__ = specialCust.prototype;
    

    在此处阅读有关警告的信息:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

    更好的方法是创建一个新对象并将所有属性从 bob 移到那里:

    newBob = new specialCust();
    for(var prop in bob){
        newBob[prop] = bob[prop];
    }
    

    请注意,在这两种情况下,bob 都会丢失旧原型的“继承”方法和属性,尽管在后一种情况下只有不可枚举的方法和属性(如 cmets 中所述)。可枚举的对象将被复制并直接绑定到新对象,可能会覆盖继承的方法,所以也要注意这一点。

    也值得一读:https://reinteractive.com/posts/235-es6-classes-and-javascript-prototypes

    [编辑] 带有Object.keys的示例代码:

    newBob = new specialCust();
    Object.keys(bob).forEach(function(prop){
        newBob[prop] = bob[prop];
    });
    

    【讨论】:

    • 使用 for..in,您还将复制可枚举的继承方法。 ;-) 使用Object.keys(bob).forEach(...) 可能会更好。
    • 对。当然。我会改变配方。 for..of 也可以代替 Object.keys,但我认为 bob 不是一个集合。
    • @RobG 谢谢,但请您将其写为示例代码,因为我仍然不知道 Object.keys。
    • @Psi 我也做了同样的事情,但它只迭代了第一个属性,而忽略了我在旧 bob 中已经拥有的另外两个属性。 (我在旧 bob 中有三个道具,但只有第一个被指定为 newBob 的第一个道具) var newBob = new specialCustomer(); Object.keys(bob).forEach(function(key) { newBob[bob] = bob[key]; });
    • 这取决于旧 bob 中的属性来自何处。如果它们是原型的一部分,它们将不会被考虑(这就是我所说的)
    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多