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");//错误
你的问题太多太零散了,我挑重点的回答下。
prototype是函数对象默认就会有一个对象属性。本身也是对象,它的作用是:作为通过new 构造函数调用时产生的对象的原型。
JS是基于原型链继承的,和Java/C#这种基于类继承的语言有很大不同,后面OOP会展开讲解,不是一句两句说得清楚的。感兴趣也可以自己查阅JavaScript OOP相关资料。
函数是对象并不只是JavaScript这样做,这叫做first class function(第一类函数)特性,很多语言都有。百度一下。
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上的方法,不会出现在所有一般的对象上。
建议去看阮一峰javascript技术blog。
听您的解释看我这样说对吗?
哦,这种是原型链继承,只要不在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 感觉不到类和对象的区分