不理解原型鏈的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創建的原型鏈屬性會無法被賦值?
2016-05-18
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()在 原型鏈中的特殊作用?; 或許不完全正確,供你參考吧2016-06-30
不知道還在不,借用樓上的例子,foo可以理解是obj的父對象,foo中的屬性,obj都會拷貝到自己哪里,但這是拷貝的,所以有初值,所以修改obj.x的值不會影響到foo.x的值。這和值類型類似。