方法1:早期模式
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function() {
alert(this.name);
};
方法2:对象字面量模式
//创建函数+函数的实例
var person = {
name:"NIcholas",
age:29,
job: "Software Engineer",
sayName: function() {
alert(this.name);
}
};
区别:
- 没有用new创建对象
- 没有“person.”表示属性的对象,而是花括号取代,表示属性对应哪个对象
- 赋值符号由等号变成冒号
缺点:
- 创建多个相似对象,有代码冗余,例如创建n个相似实例, sayName方法被写n次
方法3:工厂模式
//创建函数
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");
说明:
- 对象的创建程序写(封装)在函数里,解决了创建多个相似对象不冗余
方法4:构造函数模式
//创建函数
function = Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
alert(this.name);
};
}
//调用函数来创建函数实例
//调用方式1:看作构造函数
var person1 = new Person{"Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor"); //"Nicholas"
//调用方式2:看作普通函数
Person("Greg", 27, "Doctor"); //添加到window
window.sayName(); //"Greg"
//调用方式3:在另一个对象的作用域中使用
var o = new Object();
Person.call(o,"Kristen",25,"Nurse");
o.sayName(); //"Kristen"
区别:
- Person()函数代替了createPerson()函数
- 没有显式地创建对象
- 直接将属性和方法赋给了this对象
- 没有return语句
- 函数名首字母用了大写
说明:
- 不同实例上的同名函数是不相等的
alert(person1.sayName == person2.sayName); //false
缺点:
- 每个方法都要在每个实例上重新创建一遍。例如两个实例就创建了两个sayName()。
方法5:原型模式
//创建函数
function = Person(){
}
Person.prototype.name="NIcholas";
Person.prototype.age=29;
Person.prototype.job= "Software Engineer";
Person.prototype.sayName = function() {
alert(this.name);
};
//调用函数来创建函数实例
var person1 = new Person();
person1.sayName(); // "Nicholas"
var person2 = new Person();
person2.sayName(); // "Nicholas"
用于检测
1、检测一个属性在实例还是在原型(《高程》p150-152)
- hasOwnProperty()方法
检查范围:实例
属性存在对象实例中时,返回true - in操作符
检查范围:实例+原型
属性存在对象实例或原型时,返回true
所以,同时使用hasOwnProperty()方法和in操作符,就可以确定该属性到底是存在于对象中,还是存在于原型中,如下所示
//true=存在于原型中;false=存在于实例中
function hasPrototypeProperty(object,name){
return !object.hasOwnProperty(name) && (name in Object);
}
constructor(构造函数)属性