为了账号安全,请及时绑定邮箱和手机立即绑定

javascript创建对象总结(下)-收场

在上一篇《JavaScript创建对象总结(中)-关系错乱的原型模式
我们已经介绍了原型模式跟解决原型模式所导致的问题的解决方法--组合使用构造函数模式和原型模式,从而道清了混论的原型,现在我们就要进行收尾了。

1.动态原型模式

在之前我们介绍的原型模式,是将构造函数与原型模式独立,而我们的动态原型模式则是相反,它将所有信息都写在了构造函数中,最重要的是这样也保持了构造函数跟原型的优点

function Person(name, age, job) {
    // 添加属性
    this.name = name;
    this.age = age;
    this.job = job;

    // 添加方法
    if (typeof getName !== "function") {
           Person.prototype.getName = function() {
                return this.name;
        }
    }
}

var person1 = new Person("xiaoming", 12, "student");
person1.getName();    // xiaoming

上面的例子就展现了动态原型模式的特性,利用判断语句,只有getName()方法不存在的时候,才会将这个方法添加到原型中,这就实现了将所有信息写在了构造函数中了。

注意:使用动态原型模式不能使用我们原型的简写模式。

2.寄生构造函数模式

这个模式的基本思想是创建一个函数,而这个函数仅仅用于封装创建的对象,然后在返回新创建的对象。

先看个简单的例子:

// 函数使用工厂模式
function Person(name) {
    var obj  = new Object();
    obj.name  = name;
    obj.getName = function() {
        return this.name;
    };

    return obj;
}

// 使用new操作符调用函数
var person1 = new Person("xiaoming");
person1.getName();    // xiaoming

其实这个模式的用途是我们在上一篇中已经提及了,就是为了给我们自定义对象添加特殊方法,例如上篇的例子。

// 寄生构造函数模式
function addArrMethod(arr) {  

  arr.countRepeat = function() {

    var list = {};
    // this指向arr
    for(var i = 0; i < this.length; i++) {
      if (! list [this[i]]) {
        list[this[i]] = 0;
      }
      list[this[i]]++;
    }

    return list ;
  }
  return arr;
}
var arr = [11, 12, 12, "name", 11, 14, 13,12];

var result = new addArrMethod(arr);
result.countRepeat();    // Object {11: 2, 12: 3, 13: 1, 14: 1, name: 1}

在这个例子中,我们给我们的arr数组对象添加了记录数组各项出现次数的方法。

3.稳妥构造函数模式

所谓稳妥那就是没有公共属性,并且其方法也引用this对象。并且稳妥方式与寄生构造函数相似,但有两处不同:

  1. 新创建对象的实例方法不引用this
  2. 不使用new操作符调用构造函数
funciton Person(name) {
    // 创建要返回的对象
    var obj = new Object();
    // 没有公共属性

    // 添加方法 
    obj.getName = function() {
        // 新创建对象的实例方法不引用this
        console.log(name);
    }
}

// 不使用new操作符调用构造函数
var person1 = Person("xiaoming");
person1.getName();    // xiaoming

注意:使用稳妥构造函数模式,只能通过添加的方法去访问变量--这也就是稳妥的实质了。(安全性)

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消