创建自定义对象最简单的方式就是创建一个Object的实例,然后再为它添加属性和方法。
Object是一个函数。
var person = new Object();
person.name = 'tianxia';
person.age = 18;
person.sayName = function() {
console.log(this.name);
}
自定义对象有两种方式
1.对象字面量语法
2.new Object()
var person = {}
Object.defineProperty(person,'name',{
writable: false,
value: 'tianxia',
})
console.log(person.name);
person.name = 'xiao';
console.log(person.name);
6.2创建对象
1.构造函数
2.对象字面量
虽然Object构造函数或对象字面量都可以创建对象,但它的缺点在于使用同一个接口创建很多对象,会产生大量的重复代码。因此就有了工厂模式的诞生。
6.2.1 工厂模式
工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程。考虑到在ECMAScript中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节。
function createPerson(name,age,job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
console.log(this.name);
}
return o;
}
var person1 = createPerson('tianxia1',18,'web前端工程师');
person1.sayName();
var person2 = createPerson('xiaoxiao1',22,'我要成为王者');
总结:
工厂模式解决了创建多个相似对象的问题。
工厂模式存在的问题是没有解决对象识别的问题(即怎样知道一个对象的类型),随着JavaScript的发展,又又一个新模式出现了。
6.2.2 构造函数模式
function Person(name,age,job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
console.log(this.name);
}
}
var person3 = new Person('tianxia2',18,'web前端工程师');
var person4 = new Person('xiaoxiao2',22,'我要成为王者');
Person函数和createPerson存在一下不同之处:
- 没有显式地创建对象;
- 直接将属性和方法赋给了this对象;
- 没有return语句。
要创建Person的新实例,必须用new操作符。以这种方式调用构造函数实际上会经历以下4个步骤:
- 创建一个新的对象;
- 将构造函数的作用域赋给新的对象(因此this就指向了这个新对象);
- 执行构造函数中的代码(为这个新对象添加属性);
- 返回新的对象。
构造函数的问题
使用构造函数的问题:就是每个方法都要在每个实例上重新创建一遍。
6.2.6 寄生构造函数模式
unction PersonX(name,age,job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
console.log(this.name);
}
//在这里return和不return 有什么区别呢?
return o;
}
var personX1 = new PersonX('天下',18,'web前端');
//如果没有return 会返回{},否则的话会返回{name: "天下", age: 18, job: "web前端", sayName: ƒ}
console.log('personX1',personX1);
提问:
return和不return 有什么区别呢?
不return的话 就返回一个{}
return的话就会重写调用构造函数时返回的值。
这个模式可以在特殊的情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊数组。由于不能直接修改Array构造函数,因此可以使用这个模式。
6.2.7 稳妥构造函数模式
function Person123(name,age) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sayName = function() {
console.log('obj.name',obj.name);
}
return obj;
}
let person123 = Person123('天下',18);
person123.sayName();
稳妥构造函数其实和工厂模式非常相似,但它们毕竟是有区别的。
首先Person123是构造函数,不是普通函数
其次,不使用this。
我们来看看工厂模式的写法:
function createPerson(name,age,job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
//console.log(this.name);
}
return o;
}
var person1 = createPerson('tianxia1',18,'web前端工程师');
person1.sayName();
稳妥构造函数遵循与寄生构造函数类似的模式,但有两点不同:
- 新创建对象的实例方法不引用this;
- 不使用new操作符调用构造函数。