先创建一个Object实例,然后为它添加属性和方法
var Person = new Object() Person.name = 'hl' Person.sayName = function () { console.log(this.name) }
对象字面量法是创建对象最快捷方便的方式,在很多场景下被使用。
var Person = { name: 'hl', sayName: function () { console.log(this.name) } }
对象字面量法的缺点是创建多个同类对象时,会产生大量重复代码,因此有了工厂模式。
工厂模式用函数封装了创建对象的细节,调用函数时传入对象属性,然后返回一个对象。
function createPerson (name) { return { name: name, sayName: function () { console.log(this.name) } } } var person = createPerson('hl') var person = new createPerson('hl') // 寄生构造函数模式
通过使用 new 操作符也可以获得同样的结果,这种方法被叫做寄生构造函数模式,(应该)与直接调用函数没什么区别。
工厂模式虽然解决了创建多个同类对象的问题,却无法识别对象是哪种具体类型。
通过构造函数创建的对象,可以使用 instanceof 操作符可以确定对象的类型。按照编程惯例,构造函数命名应该大写,以和普通的函数区别开来。
function Person (name) { this.name = name this.sayName = function () { console.log(this.name) } } p = new Person('hl') p instanceof Person // true
构造函数的特点:
没有显示的创建对象
属性和方法直接赋值给this
没有 return 语句
使用 new 操作符创建对象
构造函数的缺点是每个方法都会在每个实例上重新创建一遍,造成了内存浪费。
使用原型模式,可以方便的为对象添加属性和方法。
function Person () { } var p = new Person() Person.prototype.name = 'hl' Person.prototype.sayName = function () { console.log(this.name) } p.sayName() // hl
原型具有动态性,即先创建对象再修改原型,实例也可以获得对应的属性和方法。
原型模式也并非没有缺点,第一,原型模式不能传递初始化参数,导致每个实例都会获得相同的属性;第二,对于引用类型的值,所有实例引用的是同一个对象,看下面的例子:
function Person () { } Person.prototype.relative = ['father','mother'] var person1 = new Person() var person2 = new Person() person1.relative.push('sister') console.log(person2.relative) // [ 'father', 'mother', 'sister' ]
修改person1的属性,person2的属性也被修改了。实例一般是需要有属于自己的属性的,因此很少单独使用原型模式。
创建对象最常用的方式,就是组合使用构造函数模式和原型模式。构造函数用于自定义属性,原型模式用于定义共享的属性和方法。
function Person (name) { this.name = name } Person.prototype.sayName = function () { console.log(this.name) }
原型可以在构造函数中初始化,以便更好的封装对象创建过程。
function Person(name) { this.name = name if (typeof this.sayName !== 'function') { Person.prototype.setName= function (name) { this.name = name } Person.prototype.sayName = function () { console.log(this.name) } } }
不必用if检查每一个属性或方法,只需要检查原型初始化后应该存在的其中一个属性或方法即可。
稳妥对象指的是没有公共属性,其属性和方法也不引用this对象,并且不使用 new 操作符创建对象。适合用在一些需要安全的环境中,防止数据被修改。
function Person (name) { return { sayName: function () { console.log(name) } } } var person = Person('hl')
稳妥模式创建的对象,除了使用构造函数内定义的方法,没有办法修改和访问传入到构造函数中的原始数据。
Atas ialah kandungan terperinci 创建对象的有哪几种模式?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!