1、new Object()
缺点:步骤多不简洁。
2、字面量: var 对象名={}
缺点:如果反复创建多个对象,代码会很冗余
3、工厂函数方式
function createPerson(name,age) {
var o = new Object();
o.name = name;
o.age = age;
o.say = function(){ alert(this.name); }
return o;
}
var p1 = createPerson(“小明",21);
缺点: 本质还是Object(),将来无法根据对象的原型对象准确判断对象的类型
4、构造函数方式
- 先用构造函数定义一类对象的统一属性结构和方法
- 再用new调用构造函数,反复创建相同属性结构,不同属性值的多个对象
function Student(sname, sage){
this.sname=sname;
this.sage=sage;
this.intr=function(){ … }
}
var lilei=new Student(“Li Lei”,11)
缺点: 如果构造函数中包含方法,则重复创建,浪费内存
5、原型对象方式
先创建完全相同的对象,再给子对象添加个性化属性。
function Person() {
}
Person.prototype.name = “小名";
Person.prototype.age =21;
Person.prototype.say = function(){
console.log(this.name);
};
缺点: 步骤繁琐!
6、混合模式
先创建完全相同的对象,再给子对象添加个性化属性。
function Person(name, age) {
this.name=name;
this.age=age;
}
Person.prototype.say = function(){
console.log(this.name);
};
缺点: 不符合面向对象封装的思想
7、动态混合
function Person(name, age) {
this.name=name;
this.age=age;
if(Person.prototype.say===“undefined”){
Person.prototype.say = function(){
console.log(this.name);
};
}
}
缺点: 语义不符,if只在创建第一个对象时有意义。
8、寄生构造函数
构造函数里调用其他的构造函数
function Person(name, age) {
this.name=name;
this.age=age;
if(Person.prototype.say===“undefined”){
Person.prototype.say = function(){
console.log(this.name);
};
}
}
function Student(name, age, className) {
var p=new Person(name,age); //借鸡生蛋
p.className=className
return p;
}
缺点: 可读性差
9、ES6 Class
如何定义class
- 用class{}包裹原构造函数+原型对象方法
- 原构造函数名升级为整个class的名字,所有构造函数统一更名为"constructor“
- 原型对象中的方法,不用再加prototype前缀,也不用=function,直接简写为: 方法名(){...} 强调:直接放在class{}内的方法定义,其实还是保存在原型对象中的。
使用class
var 对象名=new class名(属性值,...);
10、稳妥构造函数
闭包,不用this,不用new!安全,可靠
function Person(name, age) {
var p={};
p.getName=function(){ return name };
p.setName=function(value){ name=value };
p.getAge=function(){ return age }
return p;
}
缺点: 使用了闭包,容易造成内存泄漏