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

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

代码段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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值