new操作符 + Object创建对象
let programmer = new Object();
programmer.name = "张三丰";
programmer.age = 108;
programmer.language = ["Vue.js","uni-app","JavaScript"];
programmer.write = ()=>{
console.log("Hello word");
}
console.log(programmer);
字面式创建对象
let programmer = {
name:"张三丰",
age:108,
language:["Vue.js","uni-app","JavaScript"],
write:()=>{
console.log("Hello word");
}
}
console.log(programmer);
以上两种方法在使用同一接口创建多个对象时,会产生大量重复代码
工厂模式
function createProgrammer(name,age,language){
let p = new Object();
p.name = name;
p.age = age;
p.language = language;
p.write = ()=>{
console.log("Hello word");
}
return p;
}
let programmer1 = createProgrammer("张三丰",108,["Vue.js","uni-app","JavaScript"])
let programmer2 = createProgrammer("张无忌",18,["golang","Java","JavaScript"])
console.log(programmer1);
console.log(programmer2);
console.log(programmer1 instanceof Object); //true
工厂模式解决了重复实例化多个对象的问题,但没有解决对象识别的问题(但是工厂模式却无从识别对象的类型,因为全部都是Object,不像Date、Array等,本例中,得到的都是p对象,对象的类型都是Object
构造函数模式
function Programmer(name,age,language){
this.name = name;
this.age = age;
this.language = language;
this.write = ()=>{
console.log("Hello word");
}
}
let programmer1 = new Programmer("张三丰",108,["Vue.js","uni-app","JavaScript"])
let programmer2 = new Programmer("张无忌",18,["golang","Java","JavaScript"])
console.log(programmer1 instanceof Programmer); //true
console.log(typeof programmer2); //object
与工厂模式的不同:
- 没有显式的创建对象
- 直接将属性和方法赋给了this对象
- 没有return语句
调用构造函数步骤:
- 创建一个新对象
- 将构造函数的作用域赋值给新对象(将this指向这个新对象)
- 执行构造函数代码(为这个新对象添加属性)
- 返回新对象(指针赋给变量person)
可以看出,构造函数知道自己是从哪里来的,通过instanceof
可以看出其即使Object
的实例,又是Person
的实例。
构造函数的缺点:
每个实例都包含不同的Function
实例(构造函数内的方法在做同一件事,但是实例话后却产生了不同的对象,方法是函数,函数也是对象)
原型模式
function Programmer(){
}
Programmer.prototype.name = '张三丰';
Programmer.prototype.age = 108;
Programmer.prototype.language = ["Vue.js","uni-app","JavaScript"];
Programmer.prototype.write = ()=>{
console.log("Hello word");
}
console.log(Programmer.prototype); //{name: "张三丰", age: 108, language: Array(3), write: ƒ, constructor: ƒ}
var programmer1 = new Programmer();
console.log(programmer1.name); //张三丰
var programmer2 = new Programmer();
programmer2.name = "张无忌";
programmer2.language = ["golang","Java","JavaScript"];
console.log(programmer2); // Programmer {name: "张无忌", language: Array(3)}
console.log(programmer2.age); //108
console.log(programmer2.prototype.name); //Cannot read property 'name' of undefined
原型模式的好处式所有对象实例共享它的方法和属性,还可以覆盖原型对象上的同名属性