关于javascript中对象和原型的问题?

var obj={
    name:'obj',
    size:0,
    describe:function (){
        return 'nothing';
    }
};
undefined
typeof obj.prototype;
"undefined"
//为什么这里是"undefined"
........................................................................
function Person(name){
    this.name=name;
}
undefined
Person.prototype.describe=function (){
    return 'Person named: '+this.name;
};
ƒ (){
    return 'Person named: '+this.name;
}
var a=new Person('a');
undefined
Person.prototype instanceof Object;
true
typeof Person.prototype;
"object"
//为什么这里是"object"

Person.prototype===Object.create(Person.prototype);
false
//为什么这里是false

问题插入代码了,为什么第一处typeof是"undefined",第二处是"object";
为什么最后一处是false

阅读 2.4k
5 个回答

问题1.//为什么这里是"undefined"
答:只有方法才有prototype属性,而你定义的obj是一个对象,只有__proto__属性,如果你打印obj.__proto__ 得到的结果就不是undefined了
问题2.//为什么这里是"object"
答:因为你的Person是方法,有prototype属性
问题3. //为什么这里是false
答:这要查看Object.create的api,Object.create(proto, [propertiesObject])其中参数proto是新创建对象的原型对象
所以obj.prototype == Object.create(obj.prototype).__proto__;
当然你也可以打印出两者,看下区别。
附上链接参考:JavaScript深入之从原型到原型链

  1. 为什么第一处typeof是"undefined"?
    obj是个实例对象,默认没有prototype
  2. 为什么第二处的prototype是object?
    第二处你用的是一个funtion,function默认有prototype,并且默认其下只有一个constructor属性指向自己。
  3. 为什么最后一处是false?
    Object.create创建了一个新的object,具体实现方式类似于下面

      Object.create =  function (o) {
          var F = function () {};
          F.prototype = o;
          return new F();
      };

1、一个对象的原型等于其构造函数的prototype;
2、Object.create(Person.prototype)是创建了以Person.prototype为原型的对象,和Person.prototype肯定不相等啊

你打印了 obj的 prototype属性,对象是没有这个属性的,只有函数有,所以会是undefined,第二处你打印了typeof Person.prototype Person.prototype应该是个function, typeof function 结果就是object,最后一个就不说了。

需要区分构造函数与 new 出来的对象获取原型的方式: 构造函数直接使用 prototype 直接设置或者获取原型, 对象则要通过 prop 或者 Object.getPrototypeOf 来获取

第一处, obj 本身未定义 prototype 这个属性
第二处, 原型是对象
第三处, 一个对象都是不等于另一个对象的, Object.create(Person.prototype) 使用 Persion.prototype 作为原型创建一个对象

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题