前言
经过一段时间的思考,接下来决定出一期督促自己学习系列的文章。这样不仅可以让自己浮躁的心平静下来,还能在分享的过程中学到更多的东西,欢迎各位小伙伴一起加入!
作为一名前端程序员,我决定从《JavaScript高级程序设计》一书开始,一方面巩固之前遗忘的知识点,另一方面加深自己对js的理解,写出漂亮的代码,哈哈。。。
(如文章内容涉及到侵权请及时联系我删除)
哈哈。。。小伙伴们,今天我们来看看面向对象。
Object.defineProperty()
方法创建修改属性;
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "博乐110"
});
console.log(person.name); // 博乐110
person.name = "Greg";
console.log(person.name); // 博乐110
访问器属性
var person = {
_year: 2020,
age: 18
};
Object.defineProperty(person, "year", {
get: function() {
return this._year
}
set: function(newValue) {
if (newValue > 2020) {
this._year= newValue;
this.age += newValue - 2020;
}
}
});
person.year= 2021;
console.log(person.age); // 19
_year:表示只能通过对象方法访问的属性。
读取属性的特性: Object.getOwnPropertyDescriptor()
创建对象
1、工厂模式
function createPerson(name, age, job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
console.log(this.name);
};
return o;
}
var person1 = createPerson("博乐110", 18, "front-end-engineer");
2、构造函数模式
构造函数大写字母开头,非构造函数小写字母开头
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
console.log(this.name);
};
}
var person1 = new Person("博乐110", 18, "front-end-engineer");
3、原型模式
function Person() {
}
Person.prototype.name = "博乐110";
Person.prototype.age = 18;
Person.prototype.job = "front-end-engineer";
Person.prototype.sayName = function() {
console.log(this.name);
};
var person1 = new Person();
person1.sayName(); // "博乐110"
var person2 = new Person();
person2.sayName(); // "博乐110"
console.log(person1.sayName == person2.sayName); // true
4、组合使用构造函数模式和原型模式
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Vue", "React"];
}
Person.prototype = {
constructor: Person,
sayName : function() {
console.log(this.name);
};
};
var person1 = new Person("博乐110", 18, "front-end-engineer");
var person2 = new Person("Greg", 17, "Doctor");
person1.friends.push("Angular");
console.log(person1.friends); // "Vue,React,Angular"
console.log(person2.friends); // "Vue,React"
console.log(person1.friends === person2.friends); // false
console.log(person1.sayName === person2.sayName); // true
5、动态原型模式
function Person(name, age, job) {
// 属性
this.name = name;
this.age = age;
this.job = job;
// 方法
if (typeof this.sayName != "function") {
Person.prototype.sayName = function() {
console.log(this.name);
};
}
}
var person1 = new Person("博乐110", 18, "front-end-engineer");
person1.sayName();
6、寄生构造函数模式
function Person(name, age, job) {
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
console.log(this.name);
};
return o;
}
var person1 = new Person("博乐110", 18, "front-end-engineer");
person1.sayName(); // "博乐110"
6、稳妥构造函数模式
function Person(name, age, job) {
// 创建要返回的对象
var o = new Object();
// 可以在这里定义私有变量和函数
// 添加方法
o.sayName = function() {
console.log(this.name);
};
// 返回对象
return o;
}
注意,以这种模式创建的对象,除了使用 sayName()方法之外,没有其他办法访问name的值。
var person1 = new Person("博乐110", 18, "front-end-engineer");
person1.sayName(); // "博乐110"
未完待续。。。
看完如果觉得还不错的小伙伴点赞或收藏,给我一点继续创作的鼓励,哈哈。。。