寄生构造函数模式如何创建对象
寄生构造函数模式通过定义一个工厂函数,在内部创建新对象、为其添加属性和方法后返回该对象来实现继承或扩展。这种模式的核心在于不依赖原型链,而是直接操作对象实例,适用于无法修改原生构造函数或需要为已有对象添加额外行为的场景。

function SpecialArray() { // 创建数组 var values = new Array(); // 添加值 values.push.apply(values, arguments); // 添加自定义方法 values.toPipedString = function () { return this.join('|'); }; // 返回对象 return values;}// 使用var colors = new SpecialArray('red', 'blue', 'green');console.log(colors.toPipedString()); // "red|blue|green"上述代码展示了如何创建一个名为 SpecialArray 的构造函数。它在内部实例化一个普通数组,并向其追加传入的参数。接着,它给这个数组实例添加了一个 toPipedString 方法,最后返回这个增强后的数组对象。调用时,我们使用 new 关键字,但返回的对象类型实际上是 Array,而非 SpecialArray 的实例。
寄生构造函数与常规构造函数的区别
寄生构造函数与普通构造函数的主要区别在于返回值的类型和原型链的关系。普通构造函数通常隐式返回 this,而寄生构造函数显式返回一个新创建的对象。这导致寄生构造函数创建的对象与构造函数本身没有原型链接关系。

立即学习“Java免费学习笔记(深入)”;
function Person(name) { this.name = name; this.sayName = function() { console.log(this.name); };}function Friend(name, age) { var friend = new Person(name); friend.age = age; friend.sayAge = function() { console.log(this.age); }; return friend;}var me = new Friend('Alice', 25);console.log(me instanceof Person); // trueconsole.log(me instanceof Friend); // false在上面的例子中,Friend 构造函数内部创建了一个 Person 实例,并为其添加了额外的属性 age 和方法 sayAge。虽然 me 是 Person 的实例(因为它是基于 Person 创建的),但它不是 Friend 的实例,因为 Friend 返回的是 Person 的实例,而不是 Friend 的原型链上的对象。这种模式允许我们在不修改原有类结构的情况下,为其添加新功能。
寄生构造函数模式的适用场景与限制
寄生构造函数模式适用于那些我们无法直接修改构造函数原型,或者需要为特定场景定制对象行为的场合。例如,当我们需要为一个内置对象(如 Array 或 Date)添加自定义方法,而不影响全局原型时,可以使用此模式。
function CustomDate() { var d = new Date(); d.getCustomTime = function() { return this.getFullYear() + '-' + (this.getMonth()+1) + '-' + this.getDate(); }; return d;}var today = new CustomDate();console.log(today.getCustomTime()); // 输出当前日期在这个例子中,CustomDate 构造函数创建了一个 Date 实例,并添加了 getCustomTime 方法。由于返回的是 Date 的实例,因此 today 具有所有 Date 的方法,同时拥有了自定义的 getCustomTime 方法。然而,这种模式的主要限制是对象与构造函数之间缺乏明确的原型链接,使得 instanceof 检查可能产生误导。此外,由于每次调用构造函数都会创建新的方法,可能导致内存浪费,因此在性能敏感的场景中需谨慎使用。


















