this
参见我的博客this对象
javascript对象
JS 中的对象拥有字面形式(比如 var a = { .. }
)和构造形式(比如 var a = new Array(..)
)。字面形式几乎总是首选,但在某些情况下,构造形式提供更多的构建选项。
许多人声称“Javascript 中的一切都是对象”,这是不对的。对象是六种(或七中,看你从哪个方面说)基本类型之一。对象有子类型,包括 function
,还可以被行为特化,比如 [object Array]
作为内部的标签表示子类型数组。
对象是键/值对的集合。通过 .propName
或 ["propName"]
语法,值可以作为属性访问。不管属性什么时候被访问,引擎实际上会调用内部默认的 [[Get]]
操作(在设置值时调用 [[Put]]
操作),它不仅直接在对象上查找属性,在没有找到时还会遍历 [[Prototype]]
链(见第五章)。
属性有一些可以通过属性描述符控制的特定性质,比如 writable
和 configurable
。另外,对象拥有它的不可变性(它们的属性也有),可以通过使用 Object.preventExtensions(..)
、Object.seal(..)
、和 Object.freeze(..)
来控制几种不同等级的不可变性。
属性不必非要包含值 —— 它们也可以是带有getter/setter
的“访问器属性”。它们也可以是可枚举或不可枚举的,这控制它们是否会在 for..in
这样的循环迭代中出现。
你也可以使用 ES6 的 for..of
语法,在数据结构(数组,对象等)中迭代 值,它寻找一个内建或自定义的 @@iterator
对象,这个对象由一个 next()
方法组成,通过这个 next()
方法每次迭代一个数据。
类
类是一种设计模式。许多语言提供语法来启用自然而然的面向类的软件设计。JS 也有相似的语法,但是它的行为和你在其他语言中熟悉的工作原理 有很大的不同。
类意味着拷贝。当一个传统的类被实例化时,就发生了类的行为向实例中拷贝。当类被继承时,也发生父类的行为向子类的拷贝。
多态(在继承链的不同层级上拥有同名的不同函数)也许看起来意味着一个从子类回到父类的相对引用链接,但是它仍然只是拷贝行为的结果。
JavaScript 不会自动地 (像类那样)在对象间创建拷贝。
mixin 模式常用于在 某种程度上 模拟类的拷贝行为,但是这通常导致像显式假想多态那样(OtherObj.methodName.call(this, ...)
)难看而且脆弱的语法,这样的语法又常导致更难懂和更难维护的代码。
明确的 mixin 和类 拷贝 又不完全相同,因为对象(和函数!)仅仅是共享的引用被复制,不是对象/函数自身被复制。不注意这样的微小之处通常是各种陷阱的根源。