例子:數組
function createPerson(name,age){ var o = new Object(); o.name = name; o.age = age; o.sayName = function () { alert(this.name); } return o; } var person1 = createPerson("EvanChen",18,"Software Engineer");//建立一個對象
問題:沒有解決對象識別問題安全
alert(person1 instanceof createPerson)//fasle 會發現其實並不存在一個createPerson類
例子:app
function Person(name,age){ this.name = name; this.age = age; this.sayName = function(){ alert(this.name); } } var p1 = new Person('EvanChen',18);//建立一個Person類
用new操做符調用構造函數經歷瞭如下4個步驟:函數
(1)建立一個新對象this
(2)將構造函數的做用域賦給新對象prototype
(3)執行構造函數中的代碼code
(4)返回新對象對象
解決了工廠模式兌現識別問題:ip
alert(typeof(p1));// Person alert(p1 instanceof(Person));// true
例子:ci
function Person(){ } Person.prototype.name = "EvanChen"; Person.prototype.age= 18; Person.prototype.sayName= function(){ alert(this.name); } var p1 = new Person(); p1.sayName(); //"EvanChen" var p2 = new Person(); p2.sayName(); //"EvanChen" alert(p1.sayName == p2.sayName); //true
將全部屬性和方法都加在Person的prototype屬性中,所以新對象具備相同的屬性和方法。
例子:
function Person(name,age){ this.name = name; this.age = age; this.friends = ["Shelby","Court"]; }; Person.prototype = { constructor:Person, sayName:function(){ alert(this,name); } } //Person.prototype.sayName = function(){ // return this.name; //}; var person1 = new Person("EvanChen",18); var person2 = new Person("Greg",16); person1.friends.push("Van"); alert(person1.friends);//"Shelby,Court,Van" alert(person2.friends);//"Shelby,Court" alert(person1.friends == person2.friends);//false alert(person1.sayName == person2.sayName );//true
全部實例共享原型中的屬性constructor和方法sayName(),相同的屬性在構造函數中定義。
例子:
function Person(name,age){ this.name = name; this.age = age; if (typeof this.sayName != "function"){ Person.prototype.sayName = function(){ alert(this.name); }; } }; var person1 = new Person("EvanChen",18); person1.sayName();
在sayName()方法不存在的狀況下,纔會將它添加到原型中,當原型完成初始化後,可以當即在全部實例中獲得共享。
基本思想是:建立一個函數,該函數的做用僅僅是封裝對象的代碼,而後再返回新構建函數的對象
例子:
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","green"); alert(colors.toPipedString());//red|blue|green
構造函數返回的對象與構造函數外部建立的對象沒有什麼不一樣,所以不能依賴instanceof操做符來肯定對象類型。
穩妥對象指的是沒有公共屬性,並且其方法也再也不引用this的對象。穩妥對象最適合在一些安全的環境中,或者防止數據被其餘應用程序刪改時使用。
例子:
function Person(name, age) { //建立要返回的對象 var o = new Object(); //定義私有變量和函數 o.sayName = function (){ alert(name); } return o; } var person1 = Person("EvanChen", 18); person1.sayName();//"EvanChen"
在這種模式建立的對象中,除了使用sayName()方法外,沒有其餘方法訪問name的值。