随笔分类 - JavaScript基础
摘要:在 JS 中,我们并不会将一个对象(类)复制到另一个对象(实例),只是将它们关联起来,[[Prototype]] 机制如下图所示 这个机制通常被称为 原型继承,这个名称主要是为了对应面向类的世界中继承的意义,但是推翻了动态脚本中对应的语义 继承这个词会让人产生非常强的心理预期。仅仅在前面加个原型并不
阅读全文
摘要:JS 中有一个奇怪的行为一直被无耻的滥用,那就是模仿类。这种行为利用了函数的一种特殊特性:所有的函数默认都会拥有一个名为 prototype 的公有并且不可枚举的属性 function Foo() { // ... } Foo.prototype; // {} Foo.prototype 会指向一个
阅读全文
摘要:哪里是 [[Prototype]] 的尽头呢?所有普通的 [[Prototype]] 链最终都会指向内置的 Object.prototype。它包含了 JS 许多通用的功能,比如 .toString() .valueOf() .hasOwnProperty() .isPrototypeOf() 给一
阅读全文
摘要:JS中的对象有一个特殊的 [[Prototype]] 内置属性,其实就是对于其他对象的引用。几乎所有的对象在创建时,[[Prototype]] 属性都会被赋予一个非空的值。 var myObject = { a:2 } myObject.a; [[Prototype]] 引用有什么用呢?比如当你试图
阅读全文
摘要:① 什么是类,描述了一种代码的组织结构,一种在软件中对真实世界中问题领域的建模方法 ② // 非常简单的 mixin() 例子 function mixin(sourceObj, targetObj) { for (var key in sourceObj) { // 只会在不存在的情况下复制 if
阅读全文
摘要:var Something = { cool: function () { this.greeting = 'Hello World'; this.count = this.count ? this.count + 1 : 1; } } Something.cool(); Something.gre
阅读全文
摘要:JS 的对象机制并不会自动执行复制行为,由于其他语言中表现出来的复制行为,因此 JS 开发者也想出了一个方式来模拟类的复制行为,这个方法就是混入。我们先看第一种,显式混入。 // 非常简单的 mixin() 例子 function mixin(sourceObj, targetObj) { for
阅读全文
摘要:class Vehicle { constructor() { this.engines = 1 } ignition () { console.log('Turning on my engine'); } drive () { this.ignition(); console.log('Steer
阅读全文
摘要:在面向类的语言中,可以先定义一个类,然后定义一个继承前者的类。后者通常被称为 “子类”,前者通常被称为 “父类”。这些术语显然是类比父母和孩子。 定义好一个子类之后,相对于父类来说它就是一个独立并且完全不同的类。子类包含父类行为的原始副本,但是也可以重写所有继承的行为甚至定义新行为 思考下面关于类继
阅读全文
摘要:“类”和“实例”的概念来源于房屋建造。 建筑蓝图只是建筑计划,它们并不是真正的建筑,我们还需要建筑工人来建造建筑。建筑工人会按照蓝图建造建筑。实际上,他会把规划好的特性从蓝图中复制到现实世界的建筑中 建筑成为了蓝图的物理实例,本质上就是对蓝图的复制。 如果你想打开一扇门,那就必须接触真实的建筑才行-
阅读全文
摘要:在相当长的一段时间里,JS 只有一些近似类的语法元素,比如 new 和 instanceof,不过后来的 ES6 中新增了一些元素,比如 class 关键字。这是不是意味着 JS 中实际上有类呢?简单来说: 不是 由于类是一种设计模式,所以可以用一些方法近似实现类的功能。为了满足对于类设计的最普遍需
阅读全文
摘要:好的设计就是把数据以及和它相关的行为打包(封装)起来,这在正式的计算机科学中有时被称为数据结构 用来表示一个单词或者短语的一串字符通常被称为字符串。字符就是数据。但是你关心的往往不是数据是什么,而是可以对数据做什么,所以可以应用在这种数据上的行为(计算长度,添加数据,搜索等)都被设计为 String
阅读全文
摘要:1、是这样的,不同的对象的底层都表示为二进制,在 js 中二进制前三位都为 0 的话会判断为 object 的类型, null 的二进制是全 0,自然前三位也是0所以执行 typeof 时会返回 ‘object’ 2、 var myArray = [1,2,3]; var it = myArray[
阅读全文
摘要:for 循环可以遍历数组 var myArray = [1,2,3]; for(var i=0; i<myArray.length; i++) { console.log(myArray[i]) } // 1 2 3 ES5 增加了数组的辅助迭代器,包括 forEach(...)、every(...
阅读全文
摘要:myObject.a 的属性访问返回值可能是 undefined,但是这个值有可能是属性中存储的 undefined,也可能是因为属性不存在所以返回 undefined var myObject = { a: 2 } ('a' in myObject); // true ('b' in myObje
阅读全文
摘要:对象默认的[[Put]] 和 [[Get]] 操作分别可以控制属性值的设置和获取 可以使用 getter 和 setter 部分改写默认操作,但是只能应用在单个属性上。当你给一个属性定义 getter、setter 或者两者都有时,这个属性会被定义为 “访问描述符”。对于访问描述符来说,会忽略它们的
阅读全文
摘要:[[Get]] 对象访问在实现上有个微妙却非常重要的细节 var myObject = { a: 2 } myObject.a; // 2 myObject.a 是一次属性访问,在实现上,myObject.a 在 myObject 上实际上实现了 [[Get]] 操作(有点像函数调用:[[Get]]
阅读全文
摘要:JS 程序中很少需要深不可变性。有些特殊情况可能需要这样做。如果发现需要密封或者冻结所有的对象,那重新思考一下程序的设计,让它能更好地应对对象值的改变。 对象常量 结合 writable: false 和 configurable: false 就可以创建一个真正的常量属性,不可修改,重定义或者删除
阅读全文
摘要:从 ES5 开始,所有的属性都具备了属性描述符 var myObject = { a: 2 } Object.getOwnPropertyDescriptor(myObject, 'a') // {value: 2, writable: true, enumerable: true, configu
阅读全文
摘要:JS 初学者最常见的问题之一就是如何复制一个对象。看起来应该有一个内置的 copy() 方法,实际上比想象中的更复杂,我们无法选择一个默认的复制算法 function anotherFunction(){/** ... */}; var anotherObject = { c: true }; va
阅读全文