如下两段代码,分别是使用对象字面量和构造函数创建对象。
代码段1:
var a={"name":"nihao"};
console.log(a);
代码段2:
var a=function(name){
this.name=name;
};
var b= new a("nihao");
console.log(b); //a { name: 'nihao' }
问题1:这两种方式生成的对象的区别是什么呢?
问题2:函数对象存在的意义是什么?
要理解这个知识点,首先你要知道:
- 函数对象的原型是对象(原型链为:实例,通过new构造函数–>函数对象–>对象–>null)
- 函数有prototype属性,而对象没有因此,特别设计出了函数对象,方便对原型进行扩展
看下面代码也许可以帮你理解:
var a = function (name) {
this.name = name;
};
a.prototype.sex = "nan";
var b = new a("nihao");
console.log(typeof b); //object
console.log(b); // a { name: 'nihao' }
console.log(b.name); // nihao
console.log(b.sex); //nan
如上,查看console.log(b);打印的内容可以看到,对象b的原型是一个函数对象,它里面包含了在原型上扩展的属性sex总结就是:函数对象可以被继承,而普通对象无法被继承。
函数对象是一个对象,用来存放函数通过prototype扩展的属性和方法,可以被继承(构造函数实例化后生成的对象的原型就是函数对象)。
ps: 一般我们不使用__proto__属性对对象的原型链进行扩展,
它可能导致一些意想不到的问题,如下,使用__proto__对对象扩展,
我们取到的值tetst和预期的值hahah不一样
var obj = {
name: 'tetst'
};
obj.__proto__.name = 'hahah';
obj.__proto__.sex = 'nan';
console.log(obj.name); //tetst
console.log(obj.sex); //nan