创建对象的几种方式-阿里云开发者社区

开发者社区> 云计算> 正文

创建对象的几种方式

简介: 字面量方式和Object构造函数方式创建对象 var dog1 = { name: 'demu', age: 3, color: 'black' } var dog2 = { name: 'jiwawa', ...

字面量方式和Object构造函数方式创建对象

var dog1 = {
        name: 'demu',
    age: 3,
    color: 'black'
}
var dog2 = {
    name: 'jiwawa',
    age: 3,
    color: 'zongse'
}

// 用Object构造函数创建对象
var dog3 = new Object();
dog3.name = 'guibin';
dog3.age = 3;
dog3.color = 'zongsejin';

var dog4 = new Object();
dog4.name = 'jinmao';
dog4.age = 3;
dog4.color = 'huangse';

优点: 方便
缺点: 当需要创建很对对象的时候,会有很多重复的代码

工厂模式

function madeDog(name, age, color) {
    var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.color = color;
    return obj;
}

var jiwawa = new MadeDog('jiwawa',2,'white');
console.log('jiwawa',jiwawa);

var jinmao = new MadeDog('jinmao',2,'yellow');
console.log('jinmao',jinmao);

优点: 解决了字面量方式创建很多类似的对象的问题
缺点: 没有解决对象识别的问题,就是所有对象的爹都是Object

构造函数的方式

原型模式

function Person() {
    
}
Person.prototype = {
    name: 'zhansan',
    age: 18,
    friends: ['lisi','wangwu']
}
var person1 = new Person();
var person2 = new Person();
// 识别对象
person1 instanceof Person; // true

person1.friends.push('chenliu');
console.log(person2.friends); // ['lisi','wangwu','chenliu']

优点: 解决了对象的归属问题
缺点:

  1. 原型上的属性都是共享的,一个实例去修改了原型上的属性,会影响到别的实例
  2. 不能传参

构造函数和原型模式组合创建对象

function Person(name, age) {
    this.name = name;
    this.age = age;
    this.friends = ['李四','王五'];
}
Person.prototype = {
    say: function() {
        console.log(this.name);
    }
}
var person1 = new Person();
var person2 = new Person();
// 识别对象
person1 instanceof Person; // true

person1.friends.push('陈六');
console.log(person1.friends); // ['李四','王五','陈六']
// person1修改了对象属性,不影响person2
console.log(person2.friends); // ['李四','王五']

寄生构造函数模式

function Person() {
    this.class = "人类";
}
function Person(name, age) {
       // 创建的对象寄生在person上面 
    var obj = new Person();
    obj.name = name;
    obj.age = age;
    obj.say = function() {
        console.log(this.name);
    }
    return obj;
}

var p = new Person('zhansan',5);
p.say();

寄生式跟工厂模式几乎一样,它的优点在于不会破坏原有对象的属性和方法,又能扩充功能

稳妥构造函数模式

function Person() {
    var name = '张三丰';
    var age = 100;
    
    var obj = new Object();
    obj.getName = function() {
        return name;
    }
    obj.setName = function(newName) {
        name = newName;
    }
    return obj;
}

var p = new Person();

优点: 只能通过getName和setName去访问和设置变量

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

其他文章