1、原型链方案
构造函数、原型和实例之间的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个原型对象的指针。
继承的本质是重写原型对象,代之以一个新类型的实例。
1 | function SuperType() { |
构造函数、原型和实例之间的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个原型对象的指针。
继承的本质是重写原型对象,代之以一个新类型的实例。
1 | function SuperType() { |
单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。
在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。
单例一般用在系统间各种模式的通信协调上。
1 | var SingletonTester = (function () { |
对于现代浏览器来说,css中指定的width就是content width。
对于IE5.x和6来说,在怪异模式中width等于content、左右padding和左右border。
其中padding
和margin
的4种写法。
1、上 右 下 左
1 | padding:10px 5px 15px 20px; |
2、上 右左 下
1 | padding:10px 5px 15px; |
3、上下 右左
1 | padding:10px 5px; |
4、四边一致
1 | padding:10px; |
concat()
连接两个或多个数组,两边的原始数组都不会变化,返回被连接数组的一个副本。
join()
把数组中所有元素放入一个字符串中,返回字符串。
slice()
从开始到结束(不包括结束)选择数组的一部分浅拷贝到一个新数组。
map()
创建一个新数组并返回,其中新数组的每个元素由调用原始数组中的每一个元素执行提供的函数得来,原始数组不会改变。
every()
对数组中的每个元素都执行一次指定的回调函数,直到回调函数返回false
,此时every()
返回false
并不再继续执行。如果回调函数对每个元素都返回true
,那么every()
将返回true
。
some()
对数组中的每个元素都执行一次指定的回调函数,直到回调函数返回true
,此时some()
返回true
并不再继续执行。如果回调函数对每个元素都返回false
,那么some()
将返回false
。
filter()
创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
Vehicle
和Car
都是对象,进行复制和粘贴。1 | // 非常简单的mixin(..)例子: |
文字形式和构造形式生成的对象是一样的。
文字(声明)形式
1 | var myObj = { |
构造形式
1 | var myObj = new Object(); |
基本数据类型:string
、number
、boolean
、null
、undefined
、symbol
typeof null
返回字符串”object“,实际上,null
本身是基本数据类型,这是语言本身的一个bug。(原理是这样:不同的对象在底层都表示为二进制,在JS中二进制前三位都为0的话会被判断为object类型,null的二进制表示是全0,自然前三位也是0,所以执行typeof时会返回”object“)object
类型,称作对象子类型(内置对象),细分有String
、Number
、Boolean
、Object
、Function
、Array
、Date
、RegExp
、Error
this
既不指向函数自身也不指向函数的词法作用域this
实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。this和词法作用域是不一样的,不能混合使用。1 | // 使用this,提供一种优雅的方式隐式“传递”一个对象引用。API设计更加简洁并且易于复用。 |
1 | function foo() { |
bar()
在自己定义的词法作用域以外的地方执行。
bar()
拥有覆盖foo()
内部作用域的闭包,使得该作用域能够一直存活,以供bar()
在之后任何时间进行引用,不会被垃圾回收器回收
bar()
持有对foo()
内部作用域的引用,这个引用就叫做闭包。1 | // 对函数类型的值进行传递 |
baz
传递给bar
,当调用这个内部函数时(现在叫做fn
),它覆盖的foo()
内部作用域的闭包就形成了,因为它能够访问a。var a = 2;
会被看成两个声明,var a;
和a = 2;
,第一个声明在编译阶段进行,第二个赋值声明会被留在原地等待执行阶段。1 | a = 2; |