码迷,mamicode.com
首页 > Web开发 > 详细

JS创建对象的七种方式

时间:2017-12-04 22:22:29      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:div   prototype   地方   导致   之间   数据   动态原型   开头   组合   

工厂模式

用函数来封装以特定接口创建的对象,可以无数次调用该函数

function creatPerson (name,age) {
    var o = new Object ();
    o.name = name;
    o.age = age;
    o.sayAge = function () {
        console.log (this.age);
    };
    return o;
}
var person1 = creatPerson ("John",22);
var person2 = creatPerson ("Amy",15);

缺点:无法知道对象类型

构造函数模式

自定义对象类型的属性和方法(构造函数始终以大写字母开头)

function Person (name,age) {
    this.name = name;
    this.age = age;
    this.sayAge = function () {
        console.log (this,age);
    }
}
var person1 = new Person ("John",22);
var person2 = new Person ("Amy",15);

person1和person2既是Object对象,也是Person对象

缺点:每个方法都要在是实例上重新创建一次,占用内存空间(不同实例上的同名函数是不相等的)

原型模式

只要创建了一个新的函数,就会为该函数创建一个prototype属性,该属性是一个指针,指向函数的原型对象,原型对象的constructor属性指向构造函数。我们在原型对象中添加属性和方法。构造函数与实例无直接关系,实例中的指针仅指向原型,不指向构造函数。

function Person () {
}
Person.prototype = {
    name : "John",
    age = 30,
    sayAge : function () {
        console.log (this.age);
    }
}

缺点:修改原型对象导致 所有实例的该属性全部被修改,没有自己独有的属性。

组合使用构造函数和原型模式

创建自定义类型最常见的模式。使用构造函数定义实例属性,使用原型模式定义方法和共享属性。

function Person (name,age) {
    this,name = name;
    this.age = age;
}
Person.prototype = {
    constructor : Person,
    sayAge : function () {
        console.log (this.name);
    }
}

动态原型模式

将所有信息封装在构造函数中,在构造函数中初始化原型。

function Person (name,age) {
    this.name = name;
    this.age = age;
    //在sayAge不存在的情况下添加到原型中,只在初次调用构造函数时执行
    if (typeof this.name != "function") {
        Person.prototype.sayAge = function () {
            console.log (this.age);
        }
    }
}

寄生构造函数模式

与工厂模式相仿。函数仅仅封装创建对象的代码,返回新创建的对象。返回的对象与构造函数或者原型属性之间没有联系。

function Person (name,age) {
    var o = new Object ();
    o.name = name;
    o.age = age;
    o.sayAge = function () {
        console.log (this.age);
    };
    return o;
}
var friend = new Person ("John",25);

缺点:无法知道对象类型

 稳妥构造函数模式

稳妥对象指没有公共属性的对象。适合在安全环境或者防止数据被改动时使用。属性只能通过方法来访问,直接访问不到。

function Person(name, age) {  
    var o = new Object();    
    o.sayName = function() { 
        //只有这里可以访问name,其他地方未定义name属性 
        console.log(name);  
    };  
    o.setName = function(value) {  
        name = value;  
    };   
    return o;  
};  
  
var friend = Person("Nicholas", 29); 
friend.sayName(); //Nicholas

缺点:无法知道对象类型

JS创建对象的七种方式

标签:div   prototype   地方   导致   之间   数据   动态原型   开头   组合   

原文地址:http://www.cnblogs.com/yoyoy/p/7979040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!