js创建对象的几种模式

js创建对象的几种模式

    • 工厂模式
    • 构造函数模式
    • 原型函数模式
    • 组合模式
    • 动态原型模式
    • 寄生构造函数模式
    • 稳妥构造函数

工厂模式

原理
在一个函数内部完成创建对象添加属性和方法。

缺陷
无法识别对象的类型。
占内存,没有提取公共方法。

实例:

 function createPerson(name, age, job){
     var o = new Object();
     o.name = name;
     o.age = age;
     o.job =  job;
     o.sayName = function(){
         alert(this.name);
    };
    return o;
 }
 var person1 = createPerson("Nicholas", 29, "Software Engineer");
 var person2 = createPerson("Greg", 27, "Doctor")
 }

构造函数模式

原理
在构造函数中把属相添加给this。

使用new 操作符创建对象的过程

  1. 创建一个新对象;
  2. 将构造函数的作用赋给新对象(this 指向该对象)
  3. 执行构造函数中的代码;
  4. 返回这个对象

缺点
5. 占内存,没有提取公共方法。

实例:

function Person(name,age,sex){
	this.name = name;
	this.age = age;
	this.sex = sex;
	this.sayHi = function(){
		alert('hi, i am '+ this.name)
	}
}
var p1 = new Person('leo', 25, 'man');
p1.sayHi();

原型函数模式

原理

  1. 每个函数创建的时候都会生成一个原型对象,原型对象中默认只有一个属性constructor 指向改函数本生。
  2. 每个构造函数的实例对象都有一个属性指向该原型对象!
  3. 给实例添加同名属相只会添加一个同名的实例属相而不会修改原型属性!!!
  4. hasOwnProperty 查看是否含有实例属性。
  5. Object.getPrototypeOf() 可以获取原型
  6. Object.getOwnPropertyDescriptor() 获取实例属性
  7. 确定属性是原型中的属性:
 function hasPrototypeProperty(object, name){
    return !object.hasOwnProperty(name) && (name in object);
}
  1. for-in 循环时,返回的是所有能够通过对象访问的、可枚举的(enumerated)属性;开发人员定义的属性都是可枚举的。
  2. Object.keys() 返回一个包含所有可枚举属性的字符串数组
  3. 使用字面量会重写原型需要自己重新指定构造方法。
  4. 原型上的引用属性会被所有实例所共享。

组合模式

最常用的模式
原理
在构造函数中私有定义属性;在原型中定义公共属性和方法。

动态原型模式

为了解决 组合构造函数 构造函数和原型分开 的问题。
原理: 原型方法也放在构造函数内部;每次构建的时候判断原型是否含有某个原型方法 如果没有在声明。

function Person(name, age, job){
    //属性
    this.name = name;
    this.age = age;
    this.job = job;
    // 方法
    if (typeof this.sayName != "function"){
        Person.prototype.sayName = function(){
            alert(this.name);
        };
    }
}
var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName();

注意
使用动态原型模式时,不能使用对象字面量重写原型。

寄生构造函数模式

原理
就是在工厂模式下 使用new 操作符。

使用情形
这个模式可以在特殊的情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊
数组。由于不能直接修改 Array 构造函数,因此可以使用这个模式

注意点
构造函数返回的对象与在构造函数外部创建的对象没有什么不同。为此,
不能依赖 instanceof 操作符来确定对象类型。由于存在上述问题,我们建议在可以使用其他模式的情
况下,不要使用这种模式。

稳妥构造函数

不使用 this 和 new 是完全封装的安全类型

    function Person(name, age, job){
    //创建要返回的对象
    var o = new Object();
    //可以在这里定义私有变量和函数
    //添加方法
    o.sayName = function(){
        alert(name);
    };
    //返回对象
    return o;
}
var friend = Person("Nicholas", 29, "Software Engineer");
friend.sayName(); //"Nicholas"

这样,变量 friend 中保存的是一个稳妥对象,而除了调用 sayName() 方法外,没有别的方式可
以访问其数据成员。

你可能感兴趣的:(前端基础)