JS创建对象的几种方式
(一)工厂模式
所谓的工厂方式就是构造一个普通的函数,在函数里面构建一个包含所有信息的对象并且返回,然后在创建对象的时候使用该函数并且传入相对应的参数即可
示例代码:
function createObject(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 = createObject(‘sunshine‘,24,‘engineer‘);
var person2 = createObject(‘yuanfang‘,21,‘student‘);
console.log(person1);
console.log(person2);
(二)构造函数模式
这种模式相对于有过c++基础的童鞋来说是非常简单易懂的,并且通过new来进行创建,调用这种方式创建的时候会经历下面四个步骤:
(1)创建一个新对象
(2)将构造函数的作用域赋给新对象,也就是this指针的指向
(3)执行构造函数中的代码
(4)返回新对象
这个new关键字是必须,如果不加,clock就不会当成构造函数调用,而只是一个普通的函数
示例代码:
function CreateObject(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayname = function(){
alert(this.name);
};
}
var person1 = new CreateObject("yuangang",23,‘engineer‘);
var person2 = new CreateObject(‘sunshine‘,45,‘student‘);
alert(person1.constructor == person2.constructor);
(三)原型模式
每一个函数都有一个prototype属性,这个属性是一个指向一个对象的指针,它可以让所有对象共享它所包含的属性和方法,每一个构造函数都有一个原型对象,原型对象在默认的时候有一个属性constructor,指向构造函数,而每一个对象都有一个指向原型对象的内部指针
示例代码:
function Person(){}
Person.prototype.name = "sunshine";
Person.prototype.age = ‘23‘;
Person.prototype.job = ‘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);
(四)组合使用构造函数模式和原型模式
说白了就是实例属性都在构造函数中定义,而由所有实例共享的属性constructor和方法都在原型中定义。
示例代码:
function Person(name ,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = [‘shelby‘,‘court‘];
}
Person.prototype = {
constructor : Person,
sayname:function(){
alert(this.name);
}
}
var person1 = new Person(‘yuanfang‘,23,‘student‘);
var person2 = new Person(‘sunshine‘,34,‘engineer‘);
person1.friends.push(‘sunshine‘);
alert(person1.friends);
alert(person2.friends);
alert(person1.friends === person2.friends);
(五)动态原型模式
是原型模式的一种特例:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if(typeof(this.sayname) != ‘function‘){
Person.prototype.sayname = function(){
alert(this.name);
};
}
}
(六)寄生构造函数模式
除了使用new操作符并把使用的包装函数叫做构造函数之外,这个魔术和工厂模式没有什么区别
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 person1 = new Person(‘yuanfang‘,23,‘student‘);
person1.sayname();
(七)稳妥构造函数模式
这个就和c++中的在构造函数中创建一个函数来访问类中的私有变量的功能是一样一样的,这里不贴代码实例了
感觉好高深啊,借此只是希望自己能够透彻理解吧,fighting