为了账号安全,请及时绑定邮箱和手机立即绑定

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");//错误  

正在回答

6 回答

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


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


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


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



3 回复 有任何疑惑可以回复我~
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上的方法,不会出现在所有一般的对象上。

3 回复 有任何疑惑可以回复我~
#1

xiao_bao2014 提问者

function Person(){}; function Student(){}; Student.prototype = new Person(); var s = new Student(); s instanceof Person; 又看了一遍您那个nstanceof js的类的protype竟然是指向一个new后的实例来实现继承的 protype上可以放基础变量可以放对象 还包含着指向实例的指针【不知道能不能叫指针】 ?刚深入看js有点晕
2015-01-29 回复 有任何疑惑可以回复我~
#2

Bosn 回复 xiao_bao2014 提问者

JS中木有指针的概念呀,反复的看一下原型链的小节吧,如果有问题,恢复帖子把问题写的具体点哟~~~另外建议开新帖,这种回复我收不到消息通知...
2015-01-29 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

哦,这种是原型链继承,只要不在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 感觉不到类和对象的区分

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JavaScript深入浅出
  • 参与学习       281112    人
  • 解答问题       1020    个

由浅入深学习JS语言特性,且解析JS常见误区,从入门到掌握

进入课程

js里的继承是怎样的

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信