JavaScript核心原理解析
周爱民
《JavaScript语言精髓与编程实践》作者,南潮科技(Ruff)首席架构师
立即订阅
3655 人已学习
课程目录
已更新 22 讲 / 共 21 讲
0/3登录后,你可以任选3讲全文学习。
开篇词 (1讲)
开篇词 | 如何解决语言问题?
免费
从零开始:JavaScript语言是如何构建起来的 (5讲)
01 | delete 0:JavaScript中到底有什么是可以销毁的
02 | var x = y = 100:声明语句与语法改变了JavaScript语言核心性质
03 | a.x = a = {n:2}:一道被无数人无数次地解释过的经典面试题
04 | export default function() {}:你无法导出一个匿名函数表达式
05 | for (let x of [1,2,3]) ...:for循环并不比使用函数递归节省开销
从表达式到执行引擎:JavaScript是如何运行的 (6讲)
06 | x: break x; 搞懂如何在循环外使用break,方知语句执行真解
07 | `${1}`:详解JavaScript中特殊的可执行结构
08 | x => x:函数式语言的核心抽象:函数与表达式的同一性
09 | (...x):不是表达式、语句、函数,但它却能执行
10 | x = yield x:迭代过程的“函数式化”
11 | throw 1;:它在“最简单语法榜”上排名第三
从原型到类:JavaScript是如何一步步走向应用编程语言的 (6讲)
12 | 1 in 1..constructor:这行代码的结果值,既可能是true,也可能是false
13 | new X:从构造器到类,为你揭密对象构造的全程
14 | super.xxx():虽然直到ES10还是个半吊子实现,却也值得一讲
15 | return Object.create(new.target.prototype):做框架设计的基本功:写一个根类
16 | [a, b] = {a, b}:让你从一行代码看到对象的本质
17 | Object.setPrototypeOf(x, null):连Brendan Eich都认错,但null值还活着
从粗通到精通的进阶之路:唯一不变的是变化本身 (1讲)
18 | a + b:动态类型是灾难之源还是最好的特性?(上)
不定期加餐 (3讲)
加餐 | 捡豆吃豆的学问(上):这门课讲的是什么?
免费
加餐 | 捡豆吃豆的学问(下):这门课该怎么学?
免费
加餐 | 让JavaScript运行起来
免费
JavaScript核心原理解析
登录|注册

12 | 1 in 1..constructor:这行代码的结果值,既可能是true,也可能是false

周爱民 2019-12-11
你好,我是周爱民。欢迎你回到我的专栏。
如果你听过上一讲,那么你应该知道,接下来我要与你聊的是 JavaScript 的面向对象系统
最早期的 JavaScript 只有一个非常非常弱的对象系统。我用过 JavaScript 1.0,甚至可能还是最早尝试用它在浏览器中写代码的一批程序员,我也寻找和收集过早期的 CEniv 和 ScriptEase,只为了探究它最早的语言特性与 JavaScript 之间的相似之处。
然而,不得不说的是,曾经的 JavaScript 在面向对象特性方面,在语法上更像 Java,而在实现上却是谁也不像。

JavaScript 1.0~1.3 中的对象

在 JavaScript 1.0 的时候,对象是不支持继承的。那时的 JavaScript 使用的是称为“类抄写”的技术来创建对象,例如:
function Car() {
this.name = "Car";
this.color = "Red";
}
var x = new Car();
关于类抄写以及与此相关的性质,我会在后续的内容中详细讲述。现在,你在这里需要留意的是:在“Car()”这个函数中,事实上该函数是以“类”的身份来声明了一系列的属性(Property)。正是因此,使用new Car()来创建的“类的实例”(也就是对象this)也就具有了这些属性。
这样的“类 -> 对象”的模型其实是很简单和粗糙的。但 JavaScript 1.0 时代的对象就是如此,并且,重要的是,事实上直到现在 JavaScript 的对象仍然如此。ECMAScript 规范明确定义了这样的一个概念:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《JavaScript核心原理解析》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(3)

  • kittyE
    1. 我理解,[] 作为单值表达式,要GetValue(v),但为啥结果是 [],不太明白,ecma关于GetValue的描述,感觉好复杂。
    2. []*[]/++[[]][+[]]-[+[]] 我随便写了一个 还真的能有值,不知道这样理解对不对,求老师解惑

    作者回复: 第2题你的理解是对的,不过表达式可以再简一些。^^.
    关于第一个问题,思考方向不是GetValue,而是toPrimitive。还有,它的结果不是[],它的求值结果是0。

    2019-12-13
  • Astrogladiator-埃蒂纳度斯
    试述表达式[]的求值过程。
    对照http://www.ecma-international.org/ecma-262/5.1/#sec-9.1
    http://www.ecma-international.org/ecma-262/5.1/#sec-8.12.8
    step1: []不是一个原始类型,需要转化成原始类型求值
    step2: 这个隐式转换是通过宿主对象中的[[DefaultValue]]方法来获取默认值
    step3: 一般在没有指定preferredType的情况下,会隐式转换为number类型的默认值
    step4: []默认值为0

    可以这么理解?这个preferredType在什么设置?

    在上述表达式中加上符号“+-*/”并确保结果可作为表达式求值。
    这个是不是只要保证表达式中是对象或者number类型或者设置了preferredType的其他l类型(除了null, undefined, NaN)

    作者回复: 第1个问题, 这样解释是不对的。[[DefaultValue]]是用在那些值类型的包装对象上的,例如5和new Number(5)之间的关系。而preferredType是另外一个问题,涉及JavaScript对“预期转换目标类型”的管理,不同的运算之间还不同(但都与具体的运算操作有关),与当前这个问题却没有太大的关系。

    第2个问题的意思,是如何使一个表达式里面只出现“+-*/”和"[]",并且表达式还可以通过语法检测并计算求值。

    2019-12-11
  • 许童童
    老师讲得非常好,JavaScript中的面向对象设计确实很独特,早期我们还称其为基于对象,不过随着我们对JavaScript了解的深入,现在都已经改口了。对象存取的结果是面向对象运行时中结果的体现,如果属性不是自有的,就由原型决定,如果属性是存取方法,就由方法求值决定。另外,属性描述符有两种主要形式:数据描述符和存取描述符。
    2019-12-11
收起评论
3
返回
顶部