创建对象的几种方式
1、通过字面量的方式直接创建
var obj = {"name":'jack','age':'18'}
2、工厂模式
弊端:没有解决对象的识别问题,即怎么知道一个对象的类型。
function createPerson(name, age){ var obj = new Object(); obj.name = name; obj.age = age; obj.showName = function(){ console.log(this.name); } return obj; } var person1 = createPerson('Jack','18'); person1.showName(); //Jack
3、构造函数模式
function Person(name, age){ this.name = name; this.age = age; this.showName = function(){ console.log(this.name); } } var person2 = new Person('abccc','22'); var person3 = new Person('wang','30'); console.log(person2 instanceof Object); //true console.log(person2 instanceof Person); //true
进一步优化
function Person(name, age){ this.name = name; this.age = age; this.showName = showName; } function showName(){ console.log(this.name); }
构造函数模式与工厂模式相比:
1、没有显式的创建对象
2、直接将属性和方法赋给了this对象
3、没有return语句
要创建person的实例,必须使用new操作符,以这种方式调用构造函数实际上会经历4个步骤:
1、创建一个新对象
2、将构造函数的作用域赋给新对象
3、执行构造函数中的代码
4、返回新对象
4、原型模式
function Person(){} Person.prototype.name = 'Wangjing'; Person.prototype.age = '19'; Person.prototype.showName = function(){ console.log(this.name) } var person1 = new Person(); console.log(person1.name) // Wangjing
原型对象的问题
原型模式最大问题是由其共享的本性所导致的。
对于包含引用类型值的属性来说,问题较为突出
5、构造和原型的混合方式
创建自定义类型的最常用的方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性,这样每个实例都有自己的一份实例属性的副本,又同时共享着对方法的引用,最大限度的节省了内存。
function Person(name,age){ this.name=name; this.age=age; } Person.prototype.showName=function(){//写在构造方法外面 console.log(this.name); } var person1=new Person('key',18);