原型链
一、创建对象的方法
//1.字面量
var obj1 = {name: 'solo obj1'};
//2.new Object
var obj2 = new Object({name: 'solo obj2'})
//3.构造函数创建
var M = function(name){
this.name = name;
}
var obj3 = new M('solo obj3');
//4.Object.create
var p = {name: 'p'};
var obj4 = Object.create(p);
二、原型、构造函数、实例的关系
三、instanceof的原理
原理:判断实例对象的 __proto__是否与构造函数的 prototype 指向同一个引用。
作用:判断一个引用类型是否属于某构造函数;在继承关系中用来判断一个实例是否属于它的父类型。
所以只要在实例对象的原型链上的构造函数,instaceof 都会返回 true,如果想准确的判断构造函数究竟是哪个,可以用 constructor。
四、instanceof和typeof的区别
typeof 对于基本数据类型(null, undefined, string, number, boolean, symbol),除了 null 都会返回正确的类型。null 会返回 object。typeof 对于对象类型,除了函数会返回 function,其他的都返回 object。
如果我们想获得一个变量的正确类型,可以通过 Object.prototype.toString.call(xx)。这样我们就可以获得类似 [object Type] 的字符串。
用 void 0 可以安全的获得 undefined 来判断一个变量是不是 undefined 。
五、new关键字
概念:创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
过程:
- 创建一个空的简单JavaScript对象(即
{}
); - 链接该对象(即设置该对象的构造函数)到另一个对象 ;
- 将步骤1新创建的对象作为
this
的上下文 ; - 如果该函数没有返回对象,则返回
this
。
创建一个用户自定义的对象需要两步:
- 通过编写函数来定义对象类型。
- 通过
new
来创建对象实例。
创建一个对象类型,需要创建一个指定其名称和属性的函数;对象的属性可以指向其他对象,看下面的例子:
当代码 new Foo(...)
执行时,会发生以下事情:
- 一个继承自
Foo.prototype
的新对象被创建。 - 使用指定的参数调用构造函数
Foo
,并将this
绑定到新创建的对象。new Foo
等同于new Foo()
,也就是没有指定参数列表,Foo
不带任何参数调用的情况。 - 由构造函数返回的对象就是
new
表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)
六、参考
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!