对象的数据属性,可以使用Object.defineProperty 方法修改和设置。Configurable, Enumerable, Writable, Value 共四个特征描述数据属性。
//数据属性的四个特征
var person = {
name: 'Nicholas'
};
//设置为只读属性,不可修改
Object.defineProperty(person, 'name', {
writable: false
});
// person.name = 'Jane';
// alert(person.name) //'Nicholas'
//设置为不可删除特性,一旦把属性定义为不可配置,之后就不能定义为可配置了。
Object.defineProperty(person, 'name', {
configurable: false,
writable: true
});
alert(person.name); //'Nicholas'
delete person.name
alert(person.name); //'Nicholas'
构造函数
使用构造函数实现面向对象编程。
//使用构造函数创建对象
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
alert(this.name)
}
}
var person1 = new Person('Nicholas', 29, 'software engineering');
alert(person1.age);
person1.sayName()
//将方法放在构造函数外,避免重复创建相同函数
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName() {
alert(this.name)
}
var person2 = new Person('Greg', 20, 'doctor')
person2.sayName(); //Greg
alert(person2.job) //doctor
理解原型对象,使用hasOwnProperty检测某一属性是否是实例的属性还是原型对象的属性。
//使用 hasOwnProperty 方法检测属性是属于实例还是原型对象
function Person() {};
Person.prototype.name = 'Nic holas';
Person.prototype.age = 29;
Person.prototype.job = 'software engineering';
var person1 = new Person();
console.log(person1.hasOwnProperty('name')); //false
//重新在实例中定义了name属性
person1.name = 'Greg';
console.log(person1.hasOwnProperty('name')); //true
//删除实例中的name属性
delete person1.name ;
console.log(person1.hasOwnProperty('name')); //false
组合使用构造函数模式和原型模式
使用构造函数定义实例属性,用原型定义共用的方法和属性。
// 使用构造函数定义实例属性,原型对象定义共有的方法和属性
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ['susan', 'jane']
}
Person.prototype = {
constructor: Person,
sayName: function() {
alert(this.name)
}
}
var person1 = new Person('nicholas', 28, 'software engineering');
var person2 = new Person('gregy', 27, 'doctor');
person1.sayName()
// 只改变person2的朋友,person1没有改变
person2.friends.push('john')
alert(person2.friends)
alert(person1.friends)
关于用原型链实现继承的几种方式,因为现在ES6已经普及,不会再用到原型链的方式,因此没有每一段代码都执行,只是粗粗看了一遍。