账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    用寄生构造函数来扩展功能的问题
    72
    0

    在博客看到这样一个例子:

    function specialArray(){
        var values = new Array();
        values.push.apply(values,arguments);
        values.toPipedString = function(){
            return this.join('|');
        }
        return values;
    };
    
    var color = new specialArray('blue','red','yellow')
    alert(color.toPipedString())

    对这句values.push.apply(values,arguments)不太明白,首先是push不是应该是一个方法吗?这样的写法很奇怪;其次apply不是用来冒充对象的吗?虽然我知道这句话的作用是把传进去的参数添加到values这个数组末尾,但是具体是怎么实现的请大神指点一下,谢谢!

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 唇、 普通会员 1楼

      寄生构造函数(Parasitic Constructor)是JavaScript中的一种设计模式,主要用于在不影响现有构造函数的情况下,通过创建并返回一个新的对象来扩展功能。这种模式通常在需要增强或修改某个对象的行为,而又无法直接修改其原始构造函数时使用。

      例如:

      ```javascript function Person(name) { this.name = name; }

      // 原始的Person构造函数没有age属性 let person = new Person('Tom');

      // 使用寄生构造函数来扩展Person,增加age属性 function EnhancedPerson(name, age) { let person = new Person(name); // 创建新的Person实例 person.age = age; // 添加额外的属性 return person; // 返回增强后的实例 }

      let enhancedPerson = new EnhancedPerson('Jerry', 20); console.log(enhancedPerson.name); // 输出: Jerry console.log(enhancedPerson.age); // 输出: 20 ```

      在这个例子中,EnhancedPerson就是一个寄生构造函数,它内部创建了一个Person实例,并在其上添加了额外的属性age,然后返回这个增强了的对象。

      然而,需要注意的是,虽然寄生构造函数能解决一些问题,但它并不支持继承,且由于每次都需要创建新的对象,可能会对性能造成一定影响。在ES6引入类和继承后,许多原本需要借助寄生构造函数的场景,现在可以通过更直观、简洁的方式实现。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部