创建对象的9种方法
new Object()方式创建对象
var human = new Object();
human.name='zhiquanqiao';
human.love='girl';
human.age=1000000000;
字面量形式创建对象
var person = {
age:18,
gender:unknow,
sayName:function(){
console.log("i am a good man");
}
}
工厂模式
抽象了对象的具体创建过程
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");
工厂模式解决了多个类似对象问题,却没有解决对象识别问题(怎么样知道一个对象类型)。
构造函数模式
function Person(name,age,job) {
this.name= name;
this.age = age;
this.job= job;
this.sayName=function(){
alert(this.name);
}
}
var person1 = new Person("zhiquanqiao",93,"software enginerr");
var person2 = new Person("lihanyu",24,"Doctor");
Person("Greg",27,"Doctor");
window.sayName();
var o = new Object();
Person.call(o,"Kristen","Nurse");
o.sayName();
构造函数模式创建对象的主要问题,就是每个方法都要重新创建一遍。
原型模式
每创建一个函数都有一个prototype(属性),这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
function Person() {
}
Person.prototype.name = "zhiquanqiao";
Person.prototype.age=27;
Person.prototype.job="Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
}
var person1 = new Person();
person1.sayName();
var person2 = new Person();
person2.sayName();
alert(person1.sayName == person2.sayName);
原型模式存在的问题:
1.原型模式创建对象的时候省略了为构造函数传递初始化参数这一个环节,所有的实例都拥有相同的属性值。
2.原型最大的问题就在于其共享的特性。
组合使用构造函数模式和原型模式
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ["arm", "job"];
}
Person.prototype = {
constructor: Person,
sayName: function () {
alert(this.name);
}
}
var person1 = new Person("Qzqanlhy", 23, "Soft Engineer");
var person2 = new Person("Grep", 27, "Doctor");
person1.friends.push("world");
alert(person1.friends);
alert(person2.friends);
alert(person1.friends === person2.friends);
alert(person1.sayName === person2.sayName);
动态原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
//function
if(typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name);
}
}
//end function
}
var friend = new Person("Nicholas",29,"Soft engineer");
friend.sayName();
寄生构造函数模式
基本思想是创建一个函数,该函数的作用是封装创建对象的代码,然后返回新创建的对象。
function Person(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName(); //"Nicholas"
稳妥构造函数模式
function Person(name, age, job){
var o = new Object();
o.sayName = function(){
alert(name);
};
return o;
}
var friend = Person("Nicholas", 29, "Software Engineer");
friend.sayName();