督促自己学习,每天收获一点点系列(6)——面向对象

前言
经过一段时间的思考,接下来决定出一期督促自己学习系列的文章。这样不仅可以让自己浮躁的心平静下来,还能在分享的过程中学到更多的东西,欢迎各位小伙伴一起加入!
作为一名前端程序员,我决定从《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"

未完待续。。。

看完如果觉得还不错的小伙伴点赞或收藏,给我一点继续创作的鼓励,哈哈。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值