JavaScript OOD

JavaScript 原型

function Person(){}

Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
}
var p1 = new Person();
var p2 = new Person();
p1.name = "wj";
alert(p1.name); //wj——来自实例
alert(p2.hasOwnProperty("name")); //true——使用hasOwnProperty()检测属性是否在实例中
alert("name" in p1); //true——用in判断在实例或者原型中
alert(p2.name); //Nicholas——来自原型
alert(p2.hasOwnProperty("name")); //false——使用hasOwnProperty()检测属性是否在实例中
alert("name" in p2); //true——用in判断在实例或者原型中
delete p1.name;
alert(p1.name); //Nicholas——来自原型
alert(p1.hasOwnProperty("name")); //false——使用hasOwnProperty()检测属性是否在实例中
alert("name" in p1); //true——用in判断在实例或者原型中


///判断是否在原型中
function hasPrototypeProperty(object, name){
//name属性不在实例中,能够访问到name属性
return !object.hasOwnProperty(name) && (name in object);
}

call apply用法

//每个函数都包含2个非继承而来的apply()和call()方法,这2个函数的用途都是在特定的作用域中调用
function sum(num1, num2){
return num1 + num2;
}

function callSum1(num1,num2){
sum.apply(this, arguments); //传入arguments对象
}

function callSum2(num1,num2){
sum.apply(this, [num1,num2]); //传入Array
}

function callSum3(num1,num2){
sum.call(this,num1,num2);
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20
alert(callSum3(10,10)); //20

//真正的用法
window.color = "red";
var o = {color:"blue"};

function sayColor(){
alert(this.color);
}

sayColor(); //red——this.color的求值转换成了window.color的求值
sayColor.call(this); //red——全局
sayColor.call(window); //red——全局
sayColor.call(o); //blue

组合使用构造函数模式和原型模式

function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["A","B"]; //请不要把name属性放在原型中
}

Person.prototype = {
constructor: Person,
sayName: function(){
alert(this.name);
}
};

var p1 = new Person("Nicholas",29,"Software Engineer");
var p1 = new Person("Greg",29,"Doctor");

p1.friends.push("C");
alert(p1.friends); //A,B,C
alert(p2.friends); //A,B
alert(p1.friends == p2.friends); //false
alert(p1.sayName == p2.sayName); //true

寄生构造函数模式

function Person(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
//该模式用法如下
function SpecialArray(){
var values = new Array();
values.push.apply(values,arguments);
values.toPipedString = function(){
return this.join("|");
};
return values;
}

var colors = new SpecialArray("red","blue","yellow");
alert(colors.toPipedString()); //red|blue|yellow



posted @ 2011-12-29 17:24  Nicholas1984  阅读(132)  评论(0)    收藏  举报