问答详情
源自:4-3 [JavaScript]属性操作

js里的继承是怎样的

    function Exx(){}
    Exx.prototype.z = 1;
    var obj = new Exx();
    console.log(obj instanceof Object);//true 能证明所有对象皆是继承自Object吗?
    var des = Object.getOwnPropertyDescriptor(Object,"prototype");//正确
 var des = obj.getOwnPropertyDescriptor(Object,"prototype");//错误  没有这个方法,为什么,不是继承自那个对象吗
var des = obj.getOwnPropertyDescriptor(obj,"prototype");//错误 obj不是也应该有这个属性吗
var des = Object.getOwnPropertyDescriptor(Exx,"prototype");//错误  
var des = Exx.getOwnPropertyDescriptor(Exx,"prototype");//错误  

提问者:xiao_bao2014 2015-01-29 15:26

个回答

  • Bosn
    2015-01-29 16:37:34

    你的问题太多太零散了,我挑重点的回答下。


    prototype是函数对象默认就会有一个对象属性。本身也是对象,它的作用是:作为通过new 构造函数调用时产生的对象的原型


    JS是基于原型链继承的,和Java/C#这种基于类继承的语言有很大不同,后面OOP会展开讲解,不是一句两句说得清楚的。感兴趣也可以自己查阅JavaScript OOP相关资料。


    函数是对象并不只是JavaScript这样做,这叫做first class function(第一类函数)特性,很多语言都有。百度一下。



  • Bosn
    2015-01-29 15:57:05

    function Exx(){}
    Exx.prototype.z = 1;
    var obj = new Exx();
    console.log(obj instanceof Object);//问题1: true 能证明所有对象皆是继承自Object吗?
    var des = Object.getOwnPropertyDescriptor(Object,"prototype");//正确
    var des = obj.getOwnPropertyDescriptor(Object,"prototype");//问题2:错误  没有这个方法,为什么,不是继承自那个对象吗
    var des = obj.getOwnPropertyDescriptor(obj,"prototype");//问题3. 错误 obj不是也应该有这个属性吗
    var des = Object.getOwnPropertyDescriptor(Exx,"prototype");//错误  
    var des = Exx.getOwnPropertyDescriptor(Exx,"prototype");//错误

    问题1: true 能证明所有对象皆是继承自Object?

    答:instanceof检查的是左边对象的原型链上是否有右边构造器的prototype属性。(详看第一章数据类型有instanceof的讲解),一般情况下,对象字面量、一般函数构造器用new构造的对象,原型链上都会有Object.prototype, 所以instanceof Object返回true,但并不是所有对象都这样。例如:

    var obj = Object.create(null); // 这里指定创建一个原型为null的对象
    obj instanceof Object; //false

    问题2:错误  没有这个方法,为什么,不是继承自那个对象吗?
    getOwnPropertyDescriptor是Object构造器函数对象上的方法,而不是Object.prototype上的方法,所以不可以直接在一般对象上调用getOwnPropertyDescriptor。


    问题3. 错误 obj不是也应该有这个属性吗?

    同2,例如Object.prototype.toString方法存在,所以一般对象都有toString可以使用:

    var obj = {};

    obj.toString; // function

    但getOwnPropertyDescriptor是Object函数对象上的方法,而不是Object.prototype上的方法,不会出现在所有一般的对象上。

  • vaevau
    2015-06-08 11:05:15

    建议去看阮一峰javascript技术blog。

  • xiao_bao2014
    2015-01-29 16:23:24

    听您的解释看我这样说对吗?

    哦,这种是原型链继承,只要不在prototype上的属性就不会被继承

    除了那个var obj = Object.create(null);外new出来的都有prototype,这对象可以有自己prototype上的变量甚至对象,

    也指向了继承自的上级prototype上的属性 ,那prototype算是什么数据类型? 

    网上有说prototype是上级的实例,是上级的引用? js中有类和对象的概念吗?和java有什么不同吗?感觉js很随意,一个函数就是一个对象,var obj = new Exx(); obj 的prototype和Exx的prototype  是obj->Exx->Object 感觉不到类和对象的区分