实例化子类时如何避免继承父类特定属性?除删除外还有其他方法吗?
如何让子类实例不包含父类的name属性?
先看你给出的代码:
class Animal{ constructor(name){ this.name=name; } } class Dog extends Animal{ constructor(lastname){ super(); this.lastname=lastname; } } var animal = new Animal('jim'); var rudy = new Dog('rudy');
当然有办法不用事后执行delete rudy.name!我给你几个实用的方案:
方案1:子类构造函数返回自定义对象(绕开父类实例属性)
ES6里子类构造函数如果返回一个对象,就会把这个对象作为实例返回,而不是默认的this(也就是经过父类构造函数处理后的实例)。这样我们可以直接返回只包含子类属性的对象,完全避开父类的name属性:
class Dog extends Animal { constructor(lastname) { // 不用调用super(只要返回对象就可以跳过super调用要求) return { lastname: lastname }; } } var rudy = new Dog('rudy'); console.log(rudy.name); // undefined,实例里根本没有这个属性
方案2:在子类构造函数内删除name属性(实例化过程中完成)
虽然你说不能在实例化后delete,但如果是在构造函数执行期间删除,其实属于实例化的一部分,不算“实例化后”。我们可以在调用super()之后立刻删掉name:
class Dog extends Animal { constructor(lastname) { super(); // 父类构造函数给this添加了name属性(值为undefined) delete this.name; // 直接在构造函数里删除 this.lastname = lastname; } } var rudy = new Dog('rudy'); console.log(rudy.hasOwnProperty('name')); // false,实例不包含该属性
方案3:修改父类构造逻辑(如果允许改父类的话)
如果可以调整父类的代码,我们可以给父类构造函数加个判断,只有当传入name参数时才给实例赋值:
class Animal{ constructor(name){ if (name !== undefined) { // 只有传了name才赋值 this.name=name; } } } class Dog extends Animal{ constructor(lastname){ super(); // 不传name,父类就不会给实例加name属性 this.lastname=lastname; } } var rudy = new Dog('rudy'); console.log(rudy.name); // undefined,实例无该属性
这几个方案里,方案1最彻底,完全绕开了父类的实例属性影响;方案2不用改父类,只是在构造阶段清理;方案3适合能调整父类代码的场景。
内容的提问来源于stack exchange,提问作者KT-mongo
相关产品推荐
相关产品推荐

