JavaScript之面向对象
2017年8月11日
OOP
oop:面向对象程序设计(Objert-oriented programming, oop)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。他将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性,灵活性和扩展性 ——维基百科
工厂模式:
function createPerson(name, age, job) {
var obj = {
name: name,
age: age,
job: job
}
obj.getName = function() {
alert(this.name)
}
return obj;
}
var p1 = createPerson(‘p1’, 21, ‘it’);
var p2 = createPerson(‘p2’, 23, ’net’);
工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。
构造函数模式:
function Person(name, age, jobj) {
this.name = name;
this.age = age;
this.job = job;
this.getName = function() {
alert(this.name);
}
}
var p3 = new Person(‘p3’, 22, ‘work’);
var p4 = new Person(‘p4’, 26, ‘work’);
构造函数模式不仅能够创建多个对象,并且每个对象都可以通过constructor或者通过instanceof来识别对象类型(这里的类型指的是用户定义的类型 - 类,如这里的Person类),但是构造函数模式在创建实例对象时,每个方法都要重新创建一遍。
原型模式:
function Person() {};
Person.prototype = {
constructor: Person,
name: ‘’,
age: 20,
job: ‘it’,
getName: function() {
alert(this.name)
}
};
var p1 = new Person;
var p2 = new Person;
原型模式虽然可以不用每次实例化的时候都创建一遍方法,但是原型模式省略了初始化时传递参数的能力,并且由于原型对象是多个实例共享的,在其属性为非引用类型时,修改属性值可以通过在实例上添加一个同名属性进行覆盖。但是在属性值为引用类型时,只要有一个实例对该属性进行了修改,那么所有实例的这个属性都会改变!
构造函数组合原型模式:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = [‘xiaoming’, ’toma']
}
Person.prototype = {
constructor: Person,
getFriends = function() {
console.log(this.friends)
}
}
var p1 = new Person(‘p1’, 21, ‘it’);
创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参数;可谓是集两种模式之长
动态原型模式:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = [‘xiaoming’, ’tom’];
if(typeof this.getName != ‘function’) {
Person.prototype.getName = function() {
alert(this.name);
}
}
}
动态原型模式在实例化构造函数是动态的查询原型方法是否存在,如果不存在就动态的进行添加,这样修改会立即反映到所有实例中;不过在这里不能使用对象字面量重写原型,不然会切断现有实例和新原型直接的联系!
寄生构造函数模式:
function Person(name, age, job) {
var o = {
name: name,
age: age,
job: job,
getName: function() {
alert(this.name);
}
}
return o;
}
var p1 = new Person(‘xiaoming’, 22, ‘it’);
寄生构造函数模式除了使用new操作符进行实例化以外,跟工厂模式其实的一模一样的。并且,首先返回的对象跟构造函数或者是构造函数的原型属性之间是没有关系的。不建议使用!
稳妥构造函数模式:
function Person(name) {
var o = {
getName: function() {
alert(name);
},
setName: function(n) {
name = n;
}
}
return o;
}
var p = Person(‘xiaoming’);
稳妥构造函数模式不使用new操作符进行实例化,而是直接调用函数。该模式创建的对象除了使用getName和setName方法以外,没有任何办法访问name的值。
转载说明
本文允许全文转载,转载请注明来源: 平凡公子 - JavaScript之面向对象