JS中创建对象10种方式总结

104 阅读2分钟

1、new Object()

缺点:步骤多不简洁。

2、字面量: var 对象名={}

缺点:如果反复创建多个对象,代码会很冗余

3、工厂函数方式

function createPerson(name,age) { 
    var o = new Object();
    o.name = name; 
    o.age = age; 
    o.say = function(){ alert(this.name); } 
    return o; 
} 
var p1 = createPerson(“小明",21);

缺点: 本质还是Object(),将来无法根据对象的原型对象准确判断对象的类型

4、构造函数方式

  1. 先用构造函数定义一类对象的统一属性结构和方法
  2. 再用new调用构造函数,反复创建相同属性结构,不同属性值的多个对象
function Student(sname, sage){
    this.sname=sname;
    this.sage=sage;
    this.intr=function(){ … }
}
var lilei=new Student(“Li Lei”,11)

缺点: 如果构造函数中包含方法,则重复创建,浪费内存

5、原型对象方式

先创建完全相同的对象,再给子对象添加个性化属性。

function Person() {
}
Person.prototype.name = “小名";
Person.prototype.age =21;
Person.prototype.say = function(){
    console.log(this.name);
};

缺点: 步骤繁琐!

6、混合模式

先创建完全相同的对象,再给子对象添加个性化属性。

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

缺点: 不符合面向对象封装的思想

7、动态混合

function Person(name, age) {
    this.name=name;
    this.age=age;
    if(Person.prototype.say===“undefined”){
        Person.prototype.say = function(){
            console.log(this.name);
        };
    }
}

缺点: 语义不符,if只在创建第一个对象时有意义。

8、寄生构造函数

构造函数里调用其他的构造函数

function Person(name, age) {
    this.name=name;
    this.age=age;
    if(Person.prototype.say===“undefined”){
        Person.prototype.say = function(){
            console.log(this.name);
        };
    }
}
function Student(name, age, className) {
    var p=new Person(name,age); //借鸡生蛋
    p.className=className
    return p;
}

缺点: 可读性差

9、ES6 Class

如何定义class

  1. 用class{}包裹原构造函数+原型对象方法
  2. 原构造函数名升级为整个class的名字,所有构造函数统一更名为"constructor“
  3. 原型对象中的方法,不用再加prototype前缀,也不用=function,直接简写为: 方法名(){...} 强调:直接放在class{}内的方法定义,其实还是保存在原型对象中的。

使用class

var 对象名=new class名(属性值,...);

10、稳妥构造函数

闭包,不用this,不用new!安全,可靠

function Person(name, age) {
    var p={};
    p.getName=function(){ return name };
    p.setName=function(value){ name=value };
    p.getAge=function(){ return age }
    return p;
}

缺点: 使用了闭包,容易造成内存泄漏