Javascript中this与对象原型

this

参见我的博客this对象

javascript对象

参见你不懂JS: this 与对象原型–第三章:对象

JS 中的对象拥有字面形式(比如 var a = { .. })和构造形式(比如 var a = new Array(..))。字面形式几乎总是首选,但在某些情况下,构造形式提供更多的构建选项。

许多人声称“Javascript 中的一切都是对象”,这是不对的。对象是六种(或七中,看你从哪个方面说)基本类型之一。对象有子类型,包括 function,还可以被行为特化,比如 [object Array] 作为内部的标签表示子类型数组。

对象是键/值对的集合。通过 .propName["propName"] 语法,值可以作为属性访问。不管属性什么时候被访问,引擎实际上会调用内部默认的 [[Get]] 操作(在设置值时调用 [[Put]] 操作),它不仅直接在对象上查找属性,在没有找到时还会遍历 [[Prototype]] 链(见第五章)。

属性有一些可以通过属性描述符控制的特定性质,比如 writableconfigurable。另外,对象拥有它的不可变性(它们的属性也有),可以通过使用 Object.preventExtensions(..)Object.seal(..)、和 Object.freeze(..) 来控制几种不同等级的不可变性。

属性不必非要包含值 —— 它们也可以是带有getter/setter的“访问器属性”。它们也可以是可枚举或不可枚举的,这控制它们是否会在 for..in 这样的循环迭代中出现。

你也可以使用 ES6 的 for..of 语法,在数据结构(数组,对象等)中迭代 ,它寻找一个内建或自定义的 @@iterator 对象,这个对象由一个 next() 方法组成,通过这个 next() 方法每次迭代一个数据。

类是一种设计模式。许多语言提供语法来启用自然而然的面向类的软件设计。JS 也有相似的语法,但是它的行为和你在其他语言中熟悉的工作原理 有很大的不同

类意味着拷贝。当一个传统的类被实例化时,就发生了类的行为向实例中拷贝。当类被继承时,也发生父类的行为向子类的拷贝。

多态(在继承链的不同层级上拥有同名的不同函数)也许看起来意味着一个从子类回到父类的相对引用链接,但是它仍然只是拷贝行为的结果。

JavaScript 不会自动地 (像类那样)在对象间创建拷贝。

mixin 模式常用于在 某种程度上 模拟类的拷贝行为,但是这通常导致像显式假想多态那样(OtherObj.methodName.call(this, ...))难看而且脆弱的语法,这样的语法又常导致更难懂和更难维护的代码。

明确的 mixin 和类 拷贝 又不完全相同,因为对象(和函数!)仅仅是共享的引用被复制,不是对象/函数自身被复制。不注意这样的微小之处通常是各种陷阱的根源。

原型

参考文献

  1. 你不懂JS: this 与对象原型–第三章:对象
  2. 你不懂JS: this 与对象原型–第四章: 混合(淆)“类”的对象