六、面向对象
6.1 访问属性 get set
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition); //2
6.2创建对象
6.2.1 构造函数模式 任何函数,只要通过 new 操作符来调用,那它就可以作为构造函数;而任何函数,如果不通过 new 操作符来调用,那它跟普通函数也不会有什么两样。
function Person(name, age, job){ // 没有显式地创建对象new Object; 直接将属性和方法赋给了 this 对象; 没有 return 语句。函数名 Person 大写字母 P
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person("Nicholas", 29, "Software Engineer"); // 要创建 Person 的新实例,必须使用 new 操作符
var person2 = new Person("Greg", 27, "Doctor");
6.2.2 原型模式
function Person(){ //Person是一个构造函数 包含一个prototype属性 指向Person.prototype这个原型对象
}
Person.prototype.name = "Nicholas"; // Person.prototype是原型对象有一个constructor属性 指向Person构造函数
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" //person1和person2调用的sayName 是同一个函数
alert(person1.sayName == person2.sayName); //true
通过使用 hasOwnProperty()方法,判断什么时候访问的是实例属性
原型与 in 操作符 in 判断是否能通过对象能够访问给定属性
alert(person1.hasOwnProperty("name")); //false
alert("name" in person1); //true
person1.name = "Greg";
alert(person1.name); //"Greg" —— 来自实例
alert(person1.hasOwnProperty("name")); //true
alert("name" in person1); //true
alert(person2.name); //"Nicholas" —— 来自原型
alert(person2.hasOwnProperty("name")); //false
alert("name" in person2); //true
delete person1.name;
alert(person1.name); //"Nicholas" —— 来自原型
alert(person1.hasOwnProperty("name")); //false
alert("name" in person1); //true
JS高级程序设计 第六章
最新推荐文章于 2022-01-07 17:41:44 发布