亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

不理解原型鏈的set/get部分

我在IDE嘗試的時候,試了這樣的方式,發現是可以直接改原型鏈的值?

var foo = {}

foo.x = 1

var obj = Object.create(foo)

console.log("inherit from foo"+obj.hasOwnProperty('x')) //false,所以說明obj遺傳了foo的x

console.log(obj.x)//1

obj.x = 2//照理說這樣是沒辦法改變foo的值?

console.log(obj.x)//可是變成了2


我的問題是,那是不是只有用defineProperty創建的原型鏈屬性會無法被賦值?

正在回答

2 回答

var?foo?=?{};
foo.x?=?1;
var?obj?=?Object.create(foo);
obj.x?=?2;
//這里能給予賦值是很正確的,可以通俗理解為obj和foo都是普通對象,普通對象當然能給自己添加屬性賦值
//只是obj這個家伙偷懶‘引用’了foo的屬性。但不影響obj有權利隨意給自己添加屬性不受你foo的限制,
//所以obj.x可以隨意賦值,但注意其實這沒有改變foo.x的值

var?foo?=?{};
Object.defineProperty(foo,'x',{value:1});
var?obj?=?Object.create(foo);
//這里就不一樣了,Object.defineProperty()就是皇上的圣旨,給了foo特權,這個特權就是obj必須服從
//foo的指揮,只要foo說x是什么樣子,那obj的x就是什么樣子,所以這里不管obj.x賦值是多少對不起你都
//和foo.x的值一樣;

//obj.x想要翻身當主人怎么辦??當然還是需要Object.defineProperty()給的圣旨才行;
Object.defineProperty(obj,'x',{value:2});

在這個畫面的前2分鐘講了set/get會改變原型鏈訪問的方式,里面有提及Object.defineProperty()在
原型鏈中的特殊作用?;

或許不完全正確,供你參考吧


6 回復 有任何疑惑可以回復我~
#1

小A_ 提問者

非常感謝!
2016-05-19 回復 有任何疑惑可以回復我~

不知道還在不,借用樓上的例子,foo可以理解是obj的父對象,foo中的屬性,obj都會拷貝到自己哪里,但這是拷貝的,所以有初值,所以修改obj.x的值不會影響到foo.x的值。這和值類型類似。

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
JavaScript深入淺出
  • 參與學習       281092    人
  • 解答問題       1054    個

由淺入深學習JS語言特性,且解析JS常見誤區,從入門到掌握

進入課程

不理解原型鏈的set/get部分

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號