javascript|[[Prototype]] ——原型链两万字全面解析「建议收藏」( 三 )


如果你希望在第二种和第三种情况下也屏蔽 foo , 那就不能使用 = 操作符来赋值 , 而是使用
var anotherObj = {
  a: 2
  b: 2


var myObj = Object.create( anotherObj )
myObj.c =12

console.log(  myObj) // { c: 12 ___proto___: { a: 2 b: 2  

myObj.a = 100
console.log(myObj) // { c: 12 a: 100 ___proto___: { a: 100 b: 2  

var anotherObj = {
  a: 2
  b: 2

Object.defineProperty(anotherObj 'foo' {
  value: 1000
  writable: false
)
var myObj = Object.create( anotherObj )
myObj.foo = 100
console.log(myObj) // { ___proto___: { a: 2 b: 2 foo: 1000  

Object.defineProperty(myObj 'foo' {
  value: 1001
  writable: true
)

console.log(myObj) // { foo: 1001 ___proto___: { a: 2 b: 2 foo: 1001  


我在这里针对第一种情况 , 和第二种情况做了个案例 , 情况确实如书中所讲的那样 。
如果 defineProperty 定义了原型中的属性 , 并且可写与修改设置 为 false , 那么直接用 = 赋值不起作用 , 使用 defineProperty 才会起作用 。 但是事实上有谁会在代码里使用 defineProperty 来定义属性呢?究竟是在什么情况下 , 我才会去想想配置 writable configuable enmunable 这些参数呢?
很少会用上 。
「类」现在你可能很好奇:为什么一个对象需要关联到另一个对象呢?这样做有什么好处?这个问题非常好 , 但是在回答之前我们首先要理解 [[Prototype

不是什么?

为什么一个对象需要关联到另一个对象?这个问题我也想知道 , 因为就我目前的项目经验 , 用到原型的次数寥寥无几 , 好几次还是我强行加进去的 。
在没有类以前 , 人们会把方法绑定在原型对象上 , 来达到节省内存的地步 。
作者在这里自问自答 , 自肯定的写作手法 , 多少让人忍俊不禁 , 这个问题非常好?你自己提的吧!
以前我们说过 , JavaScript 和面向类的语法不同 , 它并没有作为对象的抽象模式或者说蓝图 。 JavaScript 中只有对象 。

这句话很重要 , JavaScript 中只有对象 。 连数组都是个伪数组 , 是由对象假装而成的 。 函数也是一个对象 。
基本类型连 null 都是一个对象 。
JavaScript 的基本类型 string nmber boolean undefined 不是对象 。
JavaScript 这门语言设计出来 , 本身就是作为脚本语言 , 是为了在一页中使用的 , 如今会去讨论设计蓝图的问题 , 也是因为它现在扮演着更为重要的角色 , 代码量也是极剧增加 。
「类」函数多年以来 , JavaScript 中有一种奇怪的行为一直在被无耻的滥用 , 那就是模仿类 。 我们会仔细分析这种方法 。
这种奇怪的「类似类」的行为利用了函数的一种特殊属性:所有函数默认都会拥有一个名为 prototype 的公有并且不可枚举的属性 , 它会指向另一个对象:
function Foo() {
    

Foo.prototype // {

这个对象通常被称为 Foo 的原型 , 因为我们通过名为 Foo.prototype 的属性引用来访问它 。 然而不幸的是 , 这个术语对我们造成极大的误导 , 稍后我们就会看到 。 如果是我的话就会叫它「之前被称为 Foo 的原型的那个对象 。 」