Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

学习总结の创建对象 #7

Open
AngellinaZ opened this issue Feb 22, 2018 · 0 comments
Open

学习总结の创建对象 #7

AngellinaZ opened this issue Feb 22, 2018 · 0 comments

Comments

@AngellinaZ
Copy link
Owner

AngellinaZ commented Feb 22, 2018

参考: JavaScript深入之创建对象的多种方式以及优缺点 ,by 冴羽,《JavaScript高级程序设计》

1. 工厂模式

用函数来封装以特定接口创建对象的细节。需要返回一个对象

function createObj (name) {
  var o = new Object();
  o.name = name;
  o.getName = function () {
        console.log(this.name);
   };
  return o
}
var person = createObj ('AngellinaZ')

缺点: 能无数次创建相似的对象,无法识别对象,每一个实例都指向同一个原型(不知道是谁家孩子)

2. 构造函数模式

function CreateObj (name) {  
    this.name = name;
    this.getName = function () {
           console.log(this.name);
    }
}
var person = new CreateObj ('AngellinaZ')

构造函数首字母大写

调用new会:

  • 创建一个新对象
  • 将构造函数的作用域赋值给新对象(this指向新对象)
  • 执行构造函数内的代码
  • 返回新对象并赋值给变量

优点: 实例可以识别为一个特定的类型,实例对象中,都有一个constructor属性(解决谁家孩子问题)
缺点: 创建功能一样的函数

3. 原型模式

function Person(name) {

}
Person.prototype.name = 'keivn';
Person.prototype.getName = function () {
    console.log(this.name);
};
var person1 = new Person();

优点:方法不会重新创建
缺点:1. 所有的属性和方法都共享 2. 不能初始化参数

3.1 原型模式优化

function Person(name) {

}
Person.prototype = {
    constructor: Person,
    name: 'kevin',
    getName: function () {
        console.log(this.name);
    }
};
var person1 = new Person();

优点: 实例可以通过constructor属性找到所属构造函数
缺点: 1. 所有的属性和方法都共享 2. 不能初始化参数

4. 组合模式

构造函数模式 用于定义实力属性,原型模式用于定义方法和共享的属性。

function Person(name) {
    this.name = name;
}

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

var person1 = new Person();

优点:该共享的共享,该私有的私有,使用最广泛的方式
缺点:有的人就是希望全部都写在一起,即更好的封装性

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant