JavaScript之面向对象的程序设计1—对象创建方式

1. 工厂模式

function createPerson(name, age) {
	var obj = new Object();
	obj.name = name;
	obj.age = age;
	obj.say = function() {
		alert(this.name);
	};
	return obj;
}
	var p1 = createPerson('shadow', 23);
	p1.say();

2. 构造函数模式

    2.1 使用new调用

function Person(name, age) {
	this.name = name;
	this.age = age;
	this.say = function() {
		alert(this.name);
	};
}
var p1 = new Person('shaow', 23);
    p1.say();

 

    2.2 不使用new调用

Person('shadow', 21);
window.say();

 

    2.3 在另一对象的作用域中调用

var o = new Object();
Person.call(o, 'shadow', 24);
o.say();

 

3.原型模式
    3.1 可以通过对象实例保存原型中的值,但不能通过对象实例重写原型中的值

function Person() {
				
}
Person.prototype.name = "prototype val";
var p1 = new Person();
var p2 = new Person();
p1.name = "object val";
alert(p1.name);//prototype val
alert(p2.name);//object val
 

     当为对象添加属性时,只会屏蔽调原型对象中的相同属性,不会修改原型对象中的属性

    3.2 可以使用delete删除实例属性

function Person() {
				
}
Person.prototype.name = "prototype val";
var p1 = new Person();
var p2 = new Person();
p1.name = "object val";
delete p1.name;
alert(p1.name);//prototype val
alert(p2.name);//prototype val

 

    3.3 使用hasOwnProperty方法可以检测一个属性是存在于实例中还是原型中

function Person() {
				
}
Person.prototype.name = "prototype val";
var p1 = new Person();
var p2 = new Person();
p1.name = "object val";
alert(p1.hasOwnProperty("name"));//true
delete p1.name;
alert(p1.hasOwnProperty("name"));//false

 

4.组合使用构造模式和原型模式(默认定义引用类型的模式)

function Person(name){
    this.name = name;
    this.friends = ["shadow", "parsons"];
}
Person.prototype = {
    constructor: Person,
    say: function(){
         alert(this.name);
    }
};
var person1 = new Person();//此时Person
var person2 = new Person();
person1.friends.push("james");
alert(person1.friends);//[shadow, parsons, james]
alert(person2.friends);//[shadow, parsons]
alert(person1.friends == person2.friends);//false
alert(person1.say == person2.say);//true

构造函数用于构造实例属性,原型模式用于构造方法和共享属性

 

你可能感兴趣的:(JavaScript之面向对象的程序设计1—对象创建方式)