js对象
1 属性
1. Configurable: 表示能否通过 delete 删除属性从而重新定义属性,能否修改属性
的特性,或者能否把属性修改为访问器属性,设置为false后,在设置除Writable就会
有错误。
2. Enumerable: 表示能否通过 for-in 循环返回属性。
3. Writable: 表示能否修改属性的值
4. Value: 包含这个属性的数据值
5. Object.defineProperty():可以修改以上属性,三个参数:属性所在的对象、属
性的名字和一个描述符对象。
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
访问器属性
1. 访问器属性不包含数据值;
2. 它们包含一对儿 getter 和 setter 函数(不过,这两个函数都不是必需的)。
3. 在读取访问器属性时,会调用 getter 函数,这个函数负责返回有效的值;
4. 在写入访问器属性时,会调用 setter 函数并传入新值,这个函数负责决定如何处理数据。
属性:
1. Configurable :表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特 性,或者能否把属性修改为数据属性。
2. Enumerable: 表示能否通过 for-in 循环返回属性
3. Get: 在读取属性时调用的函数。默认值为 undefined。
4. 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
🐷:可以把“years”写成一个对象,{_year: {Value:...}}
3 创建对象
1工厂函数:
function createPerson(name) {
var o = new Object();
o.age = age;
o.sayName = function () {...}
}
2构造函数(this)
过程:
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象。
注意:
(1)作为普通函数:属性和方法都被添加给 window 对象
(2) 构造函数问题:就是每个方法都要在每个实例上重新创建一遍
3原型模式
5 寄生构造函数模式 创建一个函数 该函数的作用仅仅是封装创建对象的代码 然后再返回新创建的对象 稳妥构造函数模式不适用new 不使用this
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"
4继承:
1. 确定原型和实例的关系
(1)instanceof, 实例 idstanceof Person
(2)isPrototypeOf Person.prototype.isPrototypeOf(p1)
2. 原型链问题:包含引用类型值的原型
3. 构造函数+原型 实线组合继承,会调用两次构造函数
4. 原型式继承
function object(0) {
function F() {}
F.prototype = o;
return new F()
}
5. 寄生继承
function createAnother(original) {
var clone=object(original); //通过调用函数创建对象
clone.sayHi = function(){
alert("hi");
};
return clone;
6. 寄生组合式继承
function inheritPrototype(subType, superType){
var prototype = object(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
}