创建对象的几种方式

简介: 字面量方式和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去访问和设置变量

目录
相关文章
|
11月前
|
设计模式 Java
创建对象的方式有哪些
创建对象的方式有哪些
|
4月前
|
设计模式 JavaScript 前端开发
创建对象的方法有哪些
创建对象的方法有哪些
37 11
|
4月前
|
定位技术 API C++
单例,函数的三种调用方式
单例,函数的三种调用方式
32 0
|
4月前
|
程序员 C++
c++ 创建对象
c++ 创建对象
25 0
|
安全 Java
创建对象的相关知识补充
创建对象的相关知识补充
57 0
IOC创建对象方式
1.使用无参构造创建对象,默认!
构造函数创建对象案例
构造函数创建对象案例
50 0
|
C++ 小程序
c++类的实例化,有没有new的区别
A a; A * a = new a(); 以上两种方式皆可实现类的实例化,有new的区别在于: 1.前者在堆栈中分配内存,后者为动态内存分配,在一般应用中是没有什么区别的,但动态内存分配会使对象的可控性增强。
1221 0
|
设计模式 安全
单例设计模式的两种方式
单例设计模式的两种方式
126 0