成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript:屬性賦值和原型鏈

開發 前端
本文要研究一下:一個對象的原型鏈是如何影響該對象自身的屬性賦值操作的.本文更詳細的闡述了一下上篇文章“[譯]JavaScript中的屬性:定義和賦值的區別”中提到的一個知識點.

本文要研究一下:一個對象的原型鏈是如何影響該對象自身的屬性賦值操作的.本文更詳細的闡述了一下上篇文章“[譯]JavaScript中的屬性:定義和賦值的區別”中提到的一個知識點.

原型鏈

每個對象都有一個包含了一個或者多個對象的原型鏈,該對象正是這個原型鏈的起始對象.原型鏈上的所有對象的所有屬性都可以被該對象訪問到.例如:

  1. var proto = { foo: 1 };  
  2. var obj = { __proto__: proto, bar: 2 };  
  3. > obj.foo  
  4. 1  
  5. > obj.bar  

我們用到了特殊屬性 __proto__  來創建原型鏈(該屬性還沒有被所有瀏覽器廣泛支持).對象obj的原型鏈包含了三個對象:起始處是obj,緊跟著proto,***是Object.prototype. Object.prototype是Object構造函數的原型對象,絕大部分原型鏈中都包含了它(大部分,但不是全部):

  1. > Object.prototype.isPrototypeOf({})  
  2. true 
  3. > Object.prototype.isPrototypeOf([])  
  4. true 
  5. > Object.prototype.isPrototypeOf(new Date())  
  6. true 

而且它是原型鏈的截止對象:

  1. > Object.getPrototypeOf(Object.prototype)  
  2. null 

普通對象的很多標準方法都是從Object.prototype上繼承下來的,比如toString()和hasOwnProperty().

為屬性賦值

如果你給一個屬性賦值,你通常只能修改原型鏈上的起始對象(也就是對象自身):如果自身屬性已經存在了,則改變這個屬性的值,否則,創建這個新的自身屬性:

  1. > obj.foo = 3;  
  2. > obj.foo  
  3. 3  
  4. > obj.hasOwnProperty("foo")  
  5. true 
  6. > proto.foo  

這樣設計的目的是:一個原型可以為其所有的實例引入了一個公用的初始值(被繼承的屬性的值).如果給其中一個實例的同名屬性執行賦值操作可以改變原型上的那個公用的屬性值的話,那么所有實例的初始值都會被改變.為了防止這種情況發生,同時還允許你修改某單個實例的初始值,屬性的賦值操作被設計為:僅允許你改變一個已存在的自身屬性的值.如果還沒有這個自身屬性,則會自動創建,再賦值.

訪問器和原型鏈

一個存在于原型鏈上的訪問器屬性[3]可以阻止"在該原型鏈的起始對象上創建同名的自身屬性".假如對象obj繼承了一個擁有getter和setter的對象:

  1. var obj = {  
  2.     __proto__: {  
  3.         get foo() {  
  4.             return 1;  
  5.         },  
  6.         set foo(x) {  
  7.             console.log("Setter called: "+x);  
  8.         }  
  9.     }  
  10. };  

給對象obj的屬性foo賦值的話,會調用到其原型上的setter訪問器,而不會給obj創建一個自身屬性foo,同理,讀取obj的foo屬性的話,也會調用到其原型上的getter訪問器:

  1. > obj.foo = 2;  
  2. Setter called: 2  
  3. > obj.foo  

如果你想禁止該屬性的賦值操作的話(也就是只讀),可以不提供setter:

  1. var obj = {  
  2.     __proto__: {  
  3.         get foo() {  
  4.             return 1;  
  5.         }  
  6.     }  
  7. };  
  8.  

這樣的賦值操作,在非嚴格模式下會靜默失敗,在嚴格模式下,會拋出異常:

  1. > (function () { "use strict"; obj.foo = 2; }());  
  2. TypeError: Cannot set property foo of obj which has only a getter 

原型鏈上的只讀屬性

如果原型鏈上的起始對象繼承了一個只讀屬性,則你無法通過賦值操作改變這個屬性的值.例如,下面的代碼:

  1. var proto = Object.defineProperty({},  
  2.     "foo",  
  3.     {  
  4.         value: 1,  
  5.         writable: false 
  6.     });  
  7. var obj = { __proto__: proto }; 

你無法給obj.foo賦值:

  1. > (function () { "use strict"; obj.foo = 2; }());  
  2. TypeError: obj.foo is read-only 

這正好和只有getter的訪問器屬性的表現相一致.這一次,原型上的屬性同樣可以作為一個共享的初始值,不同的是,我們要防止單個實例更改自己的初始值.如果你想要給obj創建一個自身屬性foo,則你可以使用Object.defineProperty()和Object.defineProperties()來完成.

英文原文:http://www.2ality.com/2012/11/property-assignment-prototype-chain.html

原文鏈接:http://www.cnblogs.com/ziyunfei/archive/2012/11/08/2759680.html

責任編輯:林師授 來源: 博客園
相關推薦

2020-02-20 14:00:15

JavaScript原型原型鏈

2020-10-20 08:35:34

JS基礎進階

2023-08-28 07:12:54

2012-01-05 15:07:11

JavaScript

2016-06-07 14:28:39

Javascript原型

2017-04-07 11:15:49

原型鏈原型Javascript

2022-05-26 09:20:01

JavaScript原型原型鏈

2016-12-27 09:10:29

JavaScript原型鏈繼承

2022-03-29 09:15:55

Javascript函數屬性

2020-09-10 07:04:30

JSJavaScript 原型鏈

2016-05-06 14:02:18

JavaScript原型鏈

2024-08-09 12:44:45

JavaScript原型鏈鏈條

2015-06-09 10:55:58

JavaScriptinstanceof運

2017-05-05 10:31:35

JavaScriptprototype__proto__

2022-05-26 23:14:26

原型原型鏈JS繼承

2011-08-31 14:48:33

JavaScript

2019-02-27 16:00:48

JS原型原型鏈對象

2024-08-27 12:36:33

2009-07-08 17:42:26

this屬性

2015-11-26 13:11:24

javascript原型鏈作用域
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线播放第一页 | 国产在线精品一区二区三区 | 91精品国产91久久久久久密臀 | 国产亚洲一区二区在线观看 | 色资源在线| 欧美综合一区二区三区 | 久久久99精品免费观看 | 中文字幕一级毛片 | 午夜视频在线免费观看 | 国产一级片网站 | 亚洲国产成人精品久久 | 在线观看三级av | 美国黄色毛片 | 欧美在线a | 超碰免费在线观看 | 天天看天天操 | 成人h视频 | 亚洲成av人片在线观看无码 | 美女久久视频 | av电影一区二区 | 在线观看成人免费视频 | 亚洲最大看片网站 | 欧美日一区二区 | 91精品国产欧美一区二区 | 亚洲伊人a| 国产高清在线精品一区二区三区 | 密桃av| 欧亚av在线| 久草免费在线视频 | 日本一区二区高清不卡 | 精品国产精品国产偷麻豆 | 欧美日韩在线一区二区 | 国产精品九九九 | 亚洲国产69 | 色五月激情五月 | 黄片毛片免费观看 | 国产精品久久久久久久久久 | 久色 | 自拍偷拍亚洲一区 | 欧美亚州 | 色橹橹欧美在线观看视频高清 |