写出几种建立对象的方式,并说说他们的区别是什么? 【前端每日一题-26】

写出几种建立对象的方式,并说说他们的区别是什么?

初见此题,没啥好说的,脑海中闪现以下两种方式:javascript

//字面量
var obj={};

//new实例化
var obj=new Object();复制代码

难度就这么点?百度查了查,发现本身理解得有些片面了。以下正解:java

工厂方式建立对象

function createPerson(name) {
  var obj = {};
  obj.name = name;
  obj.sayMyname = function() {
    console.log(this.name);
  };
  return obj;
}

var p1 = createPerson('Mike');
p1.sayMyname(); //Mike

var p2 = createPerson('Lily');
p2.sayMyname(); //Lily

console.log(p1 instanceof createPerson); //false
console.log(p1 instanceof Object); //true
console.log(p2 instanceof createPerson); //false
console.log(p2 instanceof Object); //true复制代码

能够明显的感受到,用此方法建立的对象没法识别创造者(这里的创造者全是Object)。app

构造函数建立对象

当new去调用一个函数,这个时候函数中的this就是建立出来的对象,并且函数的返回值就是this(隐式返回)。ide

function createPerson(name) {
  this.name = name;
  this.sayMyname = function() {
    console.log(this.name);
  };
}

var p1 = new createPerson('Mike');
p1.sayMyname(); //Mike

var p2 = new createPerson('Lily');
p2.sayMyname(); //Lily

console.log(p1 instanceof createPerson); //true
console.log(p1 instanceof Object); //true
console.log(p2 instanceof createPerson); //true
console.log(p2 instanceof Object); //true复制代码

  • 优势:建立自定义函数意味着未来能够将它的实例标识为一种特定的类型,这是构造函数赛过工厂模式的地方
  • 缺点:每一个方法都要在每一个实例上从新建立一遍,如(sayMyname)

原型方式

function Person() {}

Person.prototype.name = 'Mike';

Person.prototype.sayMyname = function() {
  console.log(this.name);
};

var p1 = new Person();

p1.sayMyname();复制代码

  • 优势:可让全部的对象实例共享它所包含的属性和方法
  • 缺点:原型中是全部属性都是共享的,可是实例通常都是要有本身的单独属性的。因此通常不多单独使用原型模式。

混合模型

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

function CreatePerson(name) {  this.name = name;}CreatePerson.prototype.sayMyname = function() {  console.log(this.name);};var p1 = new CreatePerson('Mike');p1.sayMyname();var p2 = new CreatePerson('Lily');p2.sayMyname();console.log(p1.sayMyname == p2.sayMyname); //true;缘由:都是在原型下面,在内存中只存在一份,地址相同复制代码

属性是否要放在原型下面,就要看该属性是不是可变的,若是不是可变的,就能够放在原型下面,用来公用属性,可变的话放在构造函数下面。函数

参考:

js建立对象的5种方式
ui

相关文章
相关标签/搜索