日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对象的创建

發布時間:2025/1/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对象的创建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

/*
*工廠模式
*
*/
//工廠模式:用函數來封裝以特定接口創建對象的細節

function createPerson(name,age,job){ var o = new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name) }; return o; } var person1=createPerson("chenjj",20,"boss"); var person2=createPerson("wangcc",18,"boss");

//雖然解決了創建多個相似對象的問題,但是沒有解決對象識別的問題(即怎么知道一個對象的類型)

/*
*構造函數模式
*
*/
//構造函數模式,
//像object和array這些是原生的構造函數,我們也可以創建自定義的構造函數來實例化,new一個實例。以下面這種方式定義的構造函數是定義在Global對象(在瀏覽器中是windows對象)中。

function Person(name,age,job){ //構造函數第一個字母要大寫, this.name=name; this.age=age; this.job=job; this.sayName=function(){ alert(this.name); }; } var person3=new Person("chenjj",20,"boss"); var person4=new Person("wangcc",18,"boss");//person3和person4這兩個實例中都含有constructor(構造函數)這個屬性,它指向的是他們的構造函數即Person.

//構造函數的問題:我person3和person4都有一個方法就是sayName這個方法,這兩個方法的目的都是一樣的,說出自己名字。但是我實例化的時候,person3和person4都是不同的function實例。意思就是雖然我們做的事一樣,但我們出生的時候是不一樣的。這樣會導致不同的作用域鏈和標識符解析。

//解決的辦法就是像下面這樣,把方法的定義放到函數外面。這樣我person3和person4的方法用的都是同一個函數了。

function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=sayName; } function sayName(){ alert(this.name); } var person3=new Person("chenjj",20,"boss"); var person4=new Person("wangcc",18,"boss");

//但是,問題又來了,要是我有多個方法呢?豈不是我要定義很多個全局函數?那么,原型模式就出場了。

/*
*原型模式
*
*/
//我們創建的每一個函數都有一個prototype(原型)屬性,這是一個指針,指向的是一個對象。這個對象里面包含的是可以由特定類型的所有實例共享的屬性和方法。就像上面的Person構造函數,他也有一個prototype屬性,這個prototype指向的對象就是Person的實例的原型對象。就是person3和person4的原型對象。

function Person(){}; Person.prototype.name="chenjian"; Person.prototype.age="20"; Person.prototype.job="20"; Person.prototype.sayName=function(){ alert(this.name); }; var person5=new Person(); var person6=new Person();//person5和person6都具有相同的屬性和方法,person5.sayName===person6.sayName;

//當我們執行,person5.name的時候會先在person5這個實例中找,有的話就返回name的值,
//沒有的話就繼續向原型對象中找。
//我們可以用對象字面量來重寫原型對象

function Person(){}; Person.prototype={ name:"chenjian", age:"23", job:"boss", sayName:function(){ alert(this.name); } }

?

//但是我們既然重寫了原型對象,那么構造函數和原型對象之間的聯系就會改變了,原型對象的constructor屬性不再指向原來的Person構造函數了,而是Object構造函數。所以重寫整個原型對象,情況就不一樣了。
//原型模式也有他的問題,我們知道用原型模式,所有實例都能共享相同的數據。但總得有些屬于自己的東西吧。總不可能你這個實例修改了姓名,而其他實例的姓名也迫不得已變的和你一樣了吧。

/* * *組合使用構造函數和原型模式 */ function Person(name,age,job){ this.name=name; this.age=age; this.job=job; } Person.prototype={ constructor:Person, sayName:function(){ alert(this.name); } } var person7=new Person("chenjj",23,"boss"); var person8=new Person("wangcc",18,"boss")

?

//實例的屬性都是在構造函數中定義的,你增添和刪除你的屬性并不影響我下一個實例的創建。而共享的屬性和方法則是在原型中定義。

?

轉載于:https://www.cnblogs.com/jjucap/p/5536794.html

總結

以上是生活随笔為你收集整理的对象的创建的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。