Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于继承这里 #12

Open
AlexZ33 opened this issue Jun 7, 2017 · 1 comment
Open

关于继承这里 #12

AlexZ33 opened this issue Jun 7, 2017 · 1 comment

Comments

@AlexZ33
Copy link

AlexZ33 commented Jun 7, 2017

Person.prototype = Animal.rototype;//方法1
这种方法 在改写person时候 会把Animal也改掉,不太好

可以

Person.prototype =new Animal();//方法2
我们new Animal()的时候也得到了一个Animal的实例,并且Animal的实例指向了Animal.prototype,并且调用了构造函数。但是因为调用了构造函数,所以这样继承有时候也是有问题的,比如说Animal有个name 和age,我们在这里调用它时候传name还是传age为参数呢?传任何一个都奇怪,因为这里的Person只是一个类还没有实例化。
所以只是为了继承我们调用了一个构造函数,创建了一个实例。实际上在很多情况下是不合适的

最佳方法

Person.prototype =Object.create( Animal.prototype);//方法3
这里我们创建一个空的对象,并且这个对象的原型指向 Animal.prototype
这样既保证可以继承 Animal.prototype上的方法,Person.prototype又有自己的空的对象,它的修改不会影响到原型链上的内容

这是利用了原型链写 不向上查找的特性
ps:Object.create是es5
之后才支持的,在es5之前 我们可以写过模拟的方法
if(!Object.create){ Object.create = function(proto) { function F() {} F.prototype = proto; return new F }; }
最后还是

Person.prototype.constructor = 'Person'; // 更新构造函数为人

@caoxiaoshuai1
Copy link

博客上总结的东西怪怪的,不太对。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants