对象和函数对象有什么区别?

如下两段代码,分别是使用对象字面量和构造函数创建对象。

代码段1:

var a={"name":"nihao"};
console.log(a);

代码段2:

var a=function(name){
    this.name=name;
};
var b= new a("nihao");
console.log(b);

问题1:这两种方式生成的对象的区别是什么呢?

问题2:函数对象存在的意义是什么?

阅读 6.6k
4 个回答

要理解这个知识点,首先你要知道:

1、函数对象的原型是对象(原型链为:实例,通过new构造函数-->函数对象-->对象-->null)

2、函数有prototype属性,而对象没有

因此,特别设计出了函数对象,方便对原型进行扩展,看下面代码也许可以帮你理解:

var a=function(name){
    this.name=name;
};
a.prototype.sex="nan";
var b= new a("nihao");
console.log(typeof b);
console.log(b);
console.log(b.name);
console.log(b.sex);

如上,查看console.log(b);打印的内容可以看到,对象b的原型是一个函数对象,它里面包含了在原型上扩展的属性sex

总结就是:函数对象可以被继承,而普通对象无法被继承。函数对象是一个对象,用来存放函数通过prototype扩展的属性和方法,可以被继承(构造函数实例化后生成的对象的原型就是函数对象)。

(一般我们不使用__proto__属性对对象的原型链进行扩展,它可能导致一些意想不到的问题,如下,使用__proto__对对象扩展,我们取到的值tetst和预期的值hahah不一样)

var obj = {
    name: 'tetst'
}
obj.__proto__.name = 'hahah'
obj.__proto__.sex = 'nan'
console.log(obj.name)

更多详情请查看:https://segmentfault.com/a/11...

  1. js对象字面量,优点:简洁算优点吗?
  2. 构造函数创建对象模式,优点:支持创建对象时自定义逻辑,支持原型链继承。
新手上路,请多包涵

函数对象,类似于其他高级语言中的类。

这么跟你解释不知道你能不能理解:

var a=function(name){
    this.name=name;
};
var b = function(){
    var obj = {};
    obj.__proto__ = a.prototype;
    a.call(obj);
    return obj;          
}
console.log(b);

所以

 b= {__proto:{
                constructor:function(name){
                this.name=name;
                };
                }
                
        }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题