亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳解js創建對象的幾種方法及繼承

2019-11-19 11:47:55
字體:
來源:轉載
供稿:網友

創建對象

通過Object構造函數或對象字面量創建單個對象
這些方式有明顯的缺點:使用同一個接口創建很多對象,會產生大量的重復代碼。為了解決這個問題,出現了工廠模式。

工廠模式

考慮在ES中無法創建類(ES6前),開發人員發明了一種函數,用函數來封裝以特定接口創建對象的細節。(實現起來是在一個函數內創建好對象,然后把對象返回)。

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 0;}var person1=createPerson("Nicholas",29,"Software Engineer");var person2=createPerson("Greg",27,"Doctor");

構造函數模式

像Object和Array這樣的原生構造函數,在運行時會自動出現在執行環境。此外,也可以創建自定義的構造函數,從而定義自定義對象類型的屬性和方法。

function Person(name,age,job){  this.name=name;  this.age=age;  this.job=job;  this.sayName=function(){    alert(this.name);  };}var person1=new Person(...);var person2=new Person(...);

與工廠模式相比,具有以下特點:

  1. 沒有顯式創建對象;
  2. 直接將屬性和方法賦給了this對象;
  3. 沒有return語句;
  4. 要創建新實例,必須使用new操作符;(否則屬性和方法將會被添加到window對象)
  5. 可以使用instanceof操作符檢測對象類型

構造函數的問題:

構造函數內部的方法會被重復創建,不同實例內的同名函數是不相等的??赏ㄟ^將方法移到構造函數外部解決這一問題,但面臨新問題:封裝性不好。

原型模式

我們創建的每個函數都有一個prototype屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。(prototype就是通過調用構造函數而創建的那個對象實例的原型對象)。
使用原型對象的好處是可以讓所有對象實例共享它所包含的屬性和方法。換句話說,不必在構造函數中定義對象實例的信息,而是可以將這些信息直接添加到原型對象中。

function Person(){}Person.prototype.name="Nicholas";Person.prototype.age=29;Person.prototype.job="...";Person.prototype.sayName=function(){  ...};var person1=new Person();person1.sayName();//"Nicholas"

更常見的做法是用一個包含所有屬性和方法的對象字面量來重寫整個原型對象,并重設constructor屬性。

function Person(){}Person.prototype={  name:"...",  age:29,  job:"...",  sayName:function(){    ...  }};Object.defineProperty(Person.prototype,"constructor",{  enumerable:false,  value:Person,});

原型對象的問題:

他省略了為構造函數傳遞初始化參數這一環節,結果所有實例在默認情況下都將取得相同的屬性值,雖然這會在一定程度帶來一定的不便,但不是最大的問題,最大的問題是由其共享的本性所決定的。
對于包含基本值的屬性可以通過在實例上添加一個同名屬性隱藏原型中的屬性。然后,對于包含引用數據類型的值來說,會導致問題。

組合使用構造函數模式和原型模式

這是創建自定義類型的最常見的方式。
構造函數模式用于定義實例屬性,而原型模式用于定義方法和共享的屬性。所以每個實例都會有自己的一份實例屬性的副本,但同時共享著對方法的引用,最大限度的節省了內存。同時支持向構造函數傳遞參數。

function Person(name,age,job){  this.name=name;  this.age=age;  this.job=job;  this.friends=["S","C"];}Person.prototype={  constructor:Person,  sayName:function(){    alert(this.name);  }};var person1=new Person(...);

動態原型模式

function Person(name,age,job){  this.name=name;  this.age=age;  this.job=job;  if(typeof this.sayName!="function"){    Person.prototype.sayName=function(){      alert(this.name);    };  }}

這里只有sayName()不存在的情況下,才會將它添加到原型中,這段代碼只會在初次調用構造函數時才執行。這里對原型所做的修改,能夠立刻在所有實例中得到反映。

Object.create()

ES5定義了一個名為Object.create()的方法,它創建一個新對象,其中第一個參數是這個對象的原型,第二個參數對對象的屬性進行進一步描述。

Object.create()介紹

Object.create(null) 創建的對象是一個空對象,在該對象上沒有繼承 Object.prototype 原型鏈上的屬性或者方法,例如:toString(), hasOwnProperty()等方法

Object.create()方法接受兩個參數:Object.create(obj,propertiesObject) ;

obj:一個對象,應該是新創建的對象的原型。

propertiesObject:可選。該參數對象是一組屬性與值,該對象的屬性名稱將是新創建的對象的屬性名稱,值是屬性描述符(這些屬性描述符的結構與Object.defineProperties()的第二個參數一樣)。注意:該參數對象不能是 undefined,另外只有該對象中自身擁有的可枚舉的屬性才有效,也就是說該對象的原型鏈上屬性是無效的。

var o = Object.create(Object.prototype, { // foo會成為所創建對象的數據屬性 foo: {   writable:true,  configurable:true,  value: "hello"  }, // bar會成為所創建對象的訪問器屬性 bar: {  configurable: false,  get: function() { return 10 },  set: function(value) {   console.log("Setting `o.bar` to", value);  } }});console.log(o);//{foo:'hello'}var test1 = Object.create(null) ;console.log(test1);// {} No Properties 因為在bar中設置了configurable 使用set,get方法默認都是不起作用,所以bar值無法賦值或者獲取這里的o對象繼承了 Object.prototype Object上的原型方法我們可以 對象的 __proto__屬性,來獲取對象原型鏈上的方法 如:console.log(o.__proto__);//{__defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, __lookupSetter__: ƒ, …}console.log(test1.__proto__);//undefined

通過打印發現, 將{}點開,顯示的是 No Properties ,也就是在對象本身不存在屬性跟方法,原型鏈上也不存在屬性和方法,

new object()

var test1 = {x:1};var test2 = new Object(test1);var test3 = Object.create(test1);console.log(test3);//{} //test3等價于test5var test4 = function(){  }test4.prototype = test1;var test5 = new test4();console.log(test5);console.log(test5.__proto__ === test3.__proto__);//trueconsole.log(test2);//{x:1}
var test1 = {};var test2 = new Object();var test3 = Object.create(Object.prototype);var test4 = Object.create(null);//console.log(test4.__proto__)=>undefined 沒有繼承原型屬性和方法console.log(test1.__proto__ === test2.__proto__);//trueconsole.log(test1.__proto__ === test3.__proto__);//trueconsole.log(test2.__proto__ === test3.__proto__);//trueconsole.log(test1.__proto__ === test4.__proto__);//falseconsole.log(test2.__proto__ === test4.__proto__);//falseconsole.log(test3.__proto__ === test4.__proto__);//false

總結:使用Object.create()是將對象繼承到__proto__屬性上

var test = Object.create({x:123,y:345});console.log(test);//{}console.log(test.x);//123console.log(test.__proto__.x);//3console.log(test.__proto__.x === test.x);//truevar test1 = new Object({x:123,y:345});console.log(test1);//{x:123,y:345}console.log(test1.x);//123console.log(test1.__proto__.x);//undefinedconsole.log(test1.__proto__.x === test1.x);//falsevar test2 = {x:123,y:345};console.log(test2);//{x:123,y:345};console.log(test2.x);//123console.log(test2.__proto__.x);//undefinedconsole.log(test2.__proto__.x === test2.x);//false

繼承

我這里就介紹一種吧,剩下的可以去權威指南里看去

原型鏈

ECMAScript 中描述了原型鏈的概念,并將原型鏈作為實現繼承的主要方法。其基本思想是利用原 型讓一個引用類型繼承另一個引用類型的屬性和方法。簡單回顧一下構造函數、原型和實例的關系:每 個構造函數都有一個原型對象,原型對象都包含一個指向構造函數的指針,而實例都包含一個指向原型 對象的內部指針。那么,假如我們讓原型對象等于另一個類型的實例,結果會怎么樣呢?顯然,此時的 原型對象將包含一個指向另一個原型的指針,相應地,另一個原型中也包含著一個指向另一個構造函數 的指針。假如另一個原型又是另一個類型的實例,那么上述關系依然成立,如此層層遞進,就構成了實 例與原型的鏈條。這就是所謂原型鏈的基本概念。

實現原型鏈有一種基本模式,其代碼大致如下。

function SuperType(){    this.property = true;}SuperType.prototype.getSuperValue = function(){  return this.property;};function SubType(){  this.subproperty = false;}//繼承了 SuperTypeSubType.prototype = new SuperType();SubType.prototype.getSubValue = function (){  return this.subproperty;  };  var instance = new SubType();alert(instance.getSuperValue());//true

以上代碼定義了兩個類型:SuperType 和 SubType。每個類型分別有一個屬性和一個方法。它們 的主要區別是 SubType 繼承了 SuperType,而繼承是通過創建 SuperType 的實例,并將該實例賦給 SubType.prototype 實現的。實現的本質是重寫原型對象,代之以一個新類型的實例。換句話說,原 來存在于 SuperType 的實例中的所有屬性和方法,現在也存在于 SubType.prototype 中了。在確立了 繼承關系之后,我們給 SubType.prototype 添加了一個方法,這樣就在繼承了 SuperType 的屬性和方 法的基礎上又添加了一個新方法。這個例子中的實例以及構造函數和原型之間的關系如圖 6-4 所示。

以上所述是小編給大家介紹的js創建對象的幾種方法及繼承詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲自拍另类欧美丝袜| 国产精品吊钟奶在线| 成人春色激情网| 国产一区二区香蕉| 色偷偷91综合久久噜噜| 中文字幕亚洲国产| 在线观看欧美日韩国产| 欧美精品免费播放| 国产精品视频男人的天堂| 国产视频丨精品|在线观看| 日韩精品视频在线播放| 欧美性猛交xxxx免费看| 欧美日韩国产一区在线| 亚洲二区中文字幕| 91久久夜色精品国产网站| 一个人www欧美| 最好看的2019的中文字幕视频| 色偷偷9999www| 亚洲精品少妇网址| 尤物yw午夜国产精品视频明星| 欧美日韩国产精品一区二区三区四区| 欧美中文字幕在线| 久久综合久中文字幕青草| 久久成人人人人精品欧| 久久人人爽人人爽人人片av高清| 色伦专区97中文字幕| 国产免费一区二区三区在线能观看| 国产精品∨欧美精品v日韩精品| 久久免费成人精品视频| 国产高清视频一区三区| 日日摸夜夜添一区| 精品成人乱色一区二区| 国产欧美日韩精品丝袜高跟鞋| 亚洲美女精品成人在线视频| 亚洲精品乱码久久久久久金桔影视| 久久久久久有精品国产| 欧美日韩一区二区免费视频| 2020久久国产精品| 成人免费视频在线观看超级碰| 日本精品视频在线| 97香蕉久久夜色精品国产| 日韩在线视频网站| 国内精品伊人久久| 亚洲精品久久久久久久久久久| 57pao成人永久免费视频| 国产精品成人一区二区| 欧美综合一区第一页| 国产999精品久久久| 欧美一区二区三区精品电影| 中文字幕自拍vr一区二区三区| 久久韩国免费视频| 国产激情视频一区| 国产日韩精品在线播放| 精品无人区乱码1区2区3区在线| 97国产一区二区精品久久呦| 欧美黄色www| 精品国产一区二区三区久久久| 国产精品一区二区久久| 色综合久久中文字幕综合网小说| 国产美女搞久久| 精品国产精品三级精品av网址| 欧美孕妇毛茸茸xxxx| 亚洲国产成人精品一区二区| 欧美大尺度电影在线观看| 欧美主播福利视频| 日韩在线视频播放| 亚洲精品久久久久久下一站| 91精品国产综合久久香蕉最新版| 欧美日韩国产在线播放| 午夜免费日韩视频| 欧美亚洲另类制服自拍| 亚洲成色777777女色窝| 久久夜色精品国产欧美乱| 91av视频在线观看| 日韩中文字幕在线观看| 午夜精品福利在线观看| 色99之美女主播在线视频| 一本大道亚洲视频| 国产精品视频精品视频| 精品久久久久久久久久久久| 日韩电影视频免费| 日本成人在线视频网址| 日本中文字幕不卡免费| 欧美做受高潮电影o| 国产精品国产三级国产专播精品人| 日本一区二三区好的精华液| 欧美理论电影在线观看| 日韩一区二区在线视频| 亚洲精品电影网| 欧美成人亚洲成人日韩成人| 亚洲欧美激情一区| 伊人成人开心激情综合网| 色偷偷噜噜噜亚洲男人| 久久高清视频免费| 日韩精品在线观看视频| 91在线精品视频| 国产一区二区视频在线观看| www.国产精品一二区| 亚洲激情视频网| 国产精品一久久香蕉国产线看观看| 成年无码av片在线| 成人福利网站在线观看11| 色哟哟亚洲精品一区二区| 亲爱的老师9免费观看全集电视剧| 欧美极品美女视频网站在线观看免费| 国产日韩综合一区二区性色av| 久久精品久久久久电影| 亚洲国产精品va在线| 国产成人在线亚洲欧美| 久久久久国产精品一区| 欧美尺度大的性做爰视频| 性欧美长视频免费观看不卡| 久久99国产精品自在自在app| 精品视频在线播放色网色视频| 92国产精品久久久久首页| 欧美日韩国产激情| 日韩网站在线观看| 久久国产天堂福利天堂| 国产精品第三页| 国产精品久久久久久久美男| 欧美精品videos另类日本| 97avcom| 午夜精品久久久久久久99热浪潮| 欧美精品videos另类日本| 久久久亚洲欧洲日产国码aⅴ| 一区二区日韩精品| 日韩三级成人av网| 欧美电影免费观看网站| 九九热r在线视频精品| 精品成人69xx.xyz| 国产精品流白浆视频| 福利一区福利二区微拍刺激| 亚洲一区二区中文字幕| 亚洲一区二区日本| 国产美女高潮久久白浆| 91欧美激情另类亚洲| 91在线高清视频| 奇米一区二区三区四区久久| 亚洲一区免费网站| 精品国产一区二区三区久久狼黑人| 欧美精品一本久久男人的天堂| 欧美日韩国产页| 国产精品jvid在线观看蜜臀| 欧美中在线观看| 欧美精品videos| 欧美午夜无遮挡| 国产精品伦子伦免费视频| 日韩欧美极品在线观看| 久久国产精品久久久| 91香蕉亚洲精品| 欧美成人第一页| 亚洲精品成人久久电影| 久久久久一本一区二区青青蜜月| 亚洲欧美日韩爽爽影院| 中文字幕9999| 日韩av中文字幕在线免费观看| 国产精品久久久久久久7电影| 国产精品欧美一区二区三区奶水| 97久久精品国产| 国产精品日韩一区| 97精品在线观看| 欧美在线一区二区三区四| 欧美综合第一页| 久久影院资源站|