Fork me on GitHub

自测练习之深入理解对象(1)


构造函数和对象原型

有一种创建对象的方法,我们可以直接从一些公有原型中派生并构造对象,即用构造函数来创建对象。在js中,调用函数之前添加一个关键字new则表示调用其构造函数。构造函数中包含了指向新对象的变量this。

自测练习1

1
2
3
4
5
6
7
8
9
10
11
12
13
var a = function(){}
a.b = 1
a.prototype.b = 2
a.prototype.c = 3
a.prototype.d = 4
console.log(a.b)
console.log(new a().b)
var foo = new a()
foo.c = 5
console.log(foo.c)
console.log(foo.d)
//请问输出的是什么?

对构造函数来说,都会自动获得一个名为prototype的属性。默认情况下,该属性是一个普通的派生自Object.prototype的空对象。所有使用特定构造函数创建的对象都会将构造函数的prototype属性作为其原型。
练习1分析
所以最后输出结果是:
1
2
5
4

自测练习2

1
2
3
4
5
6
7
8
9
10
var Foo = function(){
this.a = 1
return {
a:2
}
}
var bar = new Foo()
console.log(bar.a)
//请问输出是什么?

构造函数包含了指向新对象的变量this, 除非构造函数显式地返回了另一个对象的值,否则构造函数会返回这个新创建的对象。
定义了Foo这个构造函数,这个构造函数很明显是返回的是另一个对象{a:2},不需要this来指向新创建的对象 不知道是不是这样理解?
所以新创建的bar即为构造函数内部返回的对象{a:2},输出的结果是2。


无原型对象

我们可以使用Object.create函数并根据特定原型来创建对象,可以传递null作为原型,并创建一个无原型对象。
自测练习3

1
2
3
4
5
6
7
var map = Object.create(null);
console.log("toString" in map);
var map = Object.create({a:1});
console.log("toString" in map);
console.log("a" in map);
//请问输出是什么?

第一个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

undefined