使用寄生构造函数 创建类

本文深入解析了JavaScript中构造函数的使用,特别关注于`new`操作符的作用及其如何影响对象的创建过程。通过具体代码示例,详细解释了`new`操作符如何改变`this`的指向,并且介绍了寄生构造函数的概念,展示如何通过返回新的对象来实现构造函数的功能,同时探讨了实例化过程中的对象独立性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

类似于工厂模式创建类,不同的地方在于 调用时采用了new 构造函数的模式。

new的作用:改变this指向,普通的函数调用,this指向window或者调用了该函数的对象;  其次,通过new后,函数返回一个this对象,即实例对象

寄生构造函数:没有使用默认的this返回值,而是重新return了一个对象, 该对象与this指向的对象不同,完全独立的。

function ClassA(name){ 
    var obj = new Object();
    obj.name = name;
    obj.printName = function (){
        console.log(obj.name);
        console.log(this.name);
    }
    console.log(this,this==obj);  //this指向ClassA 

    return obj;  //覆盖返回的this ,此处如果不使用return 会默认返回ClassA的实例  this
}

var o = new ClassA('lee');
console.log('o instanceof ClassA:',o instanceof ClassA);  //false
o.printName();

 

转载于:https://www.cnblogs.com/lydialee/p/4780105.html

### JavaScript 多重寄生组合式继承的构造函数实现与原理 多重寄生组合式继承是一种优化后的继承方式,它解决了传统组合继承中存在的多次调用父构造函数的问题。其核心思想是利用 `Object.create` 方法来设置子原型为父的一个实例,从而避免重复执行父构造函数。 以下是其实现和工作原理的具体说明: #### 实现代码 以下是一个基于寄生组合式继承的多重继承实现示例[^3]: ```javascript function clone(parent, child) { // 使用 Object.create 减少一次多余的构造函数调用 child.prototype = Object.create(parent.prototype); child.prototype.constructor = child; } // 定义父 Parent1 和 Parent2 function Parent1() { this.name = 'Parent1'; } Parent1.prototype.getName = function () { return this.name; }; function Parent2() { this.age = 30; } Parent2.prototype.getAge = function () { return this.age; }; // 定义子 Child 并实现多重继承 function Child() { // 调用多个父构造函数 Parent1.call(this); Parent2.call(this); this.type = 'Child'; } clone(Parent1, Child); // 设置 Child 的原型为 Parent1 的实例 clone(Parent2, Child); // 再次覆盖 Child 的原型为 Parent2 的实例 // 扩展 Child 自己的方法 Child.prototype.getType = function () { return this.type; }; let instance = new Child(); console.log(instance.getName()); // 输出: Parent1 console.log(instance.getAge()); // 输出: 30 console.log(instance.getType()); // 输出: Child ``` #### 工作原理分析 1. **构造函数绑定** 子通过 `call` 显式调用了多个父构造函数,这样可以在子实例中初始化来自不同父的属性。这种方式确保了每个父的私有数据都能被正确复制到子实例中[^5]。 2. **原型链继承** 利用 `Object.create` 方法重新设置了子的原型对象,使其成为某个父的实例。这一过程有效地实现了方法的共享,同时避免了直接修改父原型的风险[^3]。 3. **多重继承支持** 如果需要从多个父继承,则可以通过连续调用 `clone` 方法依次替换子的原型对象。最终的结果是以最后一个指定的父作为实际的原型来源,但这并不影响之前已经通过 `call` 初始化好的实例属性[^4]。 4. **性能优化** 相较于传统的组合继承,该方案仅需在创建时调用一次父构造函数即可完成必要的初始化操作,减少了不必要的开销[^3]。 #### 注意事项 尽管这种方法能够很好地满足大多数需求,但在某些特殊情况下仍可能存在局限性: - 当涉及复杂的数据结构或者深层嵌套的对象时,简单的赋值可能会引发浅拷贝问题,导致意外的行为发生。 - 对于非常庞大的项目来说,频繁地更改原型链可能导致调试困难。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值