构造函数和对象原型
有一种创建对象的方法,我们可以直接从一些公有原型中派生并构造对象,即用构造函数来创建对象。在js中,调用函数之前添加一个关键字new则表示调用其构造函数。构造函数中包含了指向新对象的变量this。
自测练习1
对构造函数来说,都会自动获得一个名为prototype的属性。默认情况下,该属性是一个普通的派生自Object.prototype的空对象。所有使用特定构造函数创建的对象都会将构造函数的prototype属性作为其原型。
所以最后输出结果是:
1
2
5
4
自测练习2
|
|
构造函数包含了指向新对象的变量this, 除非构造函数显式地返回了另一个对象的值,否则构造函数会返回这个新创建的对象。
定义了Foo这个构造函数,这个构造函数很明显是返回的是另一个对象{a:2},不需要this来指向新创建的对象 不知道是不是这样理解?
所以新创建的bar即为构造函数内部返回的对象{a:2},输出的结果是2。
无原型对象
我们可以使用Object.create函数并根据特定原型来创建对象,可以传递null作为原型,并创建一个无原型对象。
自测练习3
|
|
第一个map,这个对象就是一个无原型对象,map里面没有prototype原型,toString函数也就不在map里面了,输出false
第二个map,这个对象有原型且原型是{a:1},要找map的属性中有没有toString,没有,再去map的原型中去找,原型是{a:1},也没有toString,再找原型的原型,即对象{a:1}的原型,这个对象的原型默认为Object.prototype,发现是存在的,故输出true 不知道解释的对不对;最后一个console.log只需找一个原型就找到了,也输出true。
所以最后输出的结果为:
false
true
true