
最好的方式是第三种来继承原来的对象
在ES5之前是没有Object.create的,可以通过简单的模式来创建即可
继承的方式
if(!Object.create){
Object.create = function(proto){
function F(){};
F.prototype = proto;
return new F;
}
}
注意 new F 会出现一个对象 更重要的是 对象有__proto__ 也就是(next指针) 指针指向F.prototype 也就是传进来的proto 也就实现了对象.__proto__ == proto 其实就是修改了指针的指向 从而形成了新的链表
Object.create(); 实现理想继承,但是有兼容性问题
第二种继承方式缺点:不能传参
还是有点难,慢慢看能理解,但是转眼就忘,以后多来看看
理想的继承;
Student.prototype = Object.create(Person.protetype);
Student.prototype.constructor = Person;
规范的继承语句,此图绿线所划。
如果没有create方法,可以用右侧代码模拟这个方法。
实现继承的方式:
function Person(){}
function Student(){}
1.Student.prototype=Person.prototype;//别用
2.Student.prototype=new Person();//在有参数时不是很好用
3.Student.prototype=Object.create(Person.prototype);//较为理想,ES5之后才能用,为了兼容,可以用下图方法:

Student.prototype.constructor=Person;

Student.prototype.constructor = Student;
自己实现Object.create
Object.create=function(proto){
function F(){}
f.prototype=proto;
return new F:
};
Object.create()es5之后才有,
es5之前可用if(!Object.create){Object.create=function(proto){
function F(){};F.prototype=proto;return new F;};
}
模拟Oject.create:
创建一个空对象F,空对象F的原型F.prototype 指向参数proto, 返回一个new F;
实现继承的方式:
function Person() {}
function Student() {}
Student.prototype = Person.prototype;//!!!不可以这么赋值,会相互影响
Student.prototype = new Person();//会有Person原型,但是还是会有问题,只是类还没有实例化
Student.prototype = Object.create(Person.prototype);// 新创建一个对象,对象的原型指向Person
ES5之才支持
ES5之前
if(!Object.create){
Object.create = function(proto){
function F() {}
F.prototype = proto;
return new F;
};
}
实现继承的方式
其中方式1.2.3都有其弊端,但是3更为完善,方式3是ES5之后才支持的,所以可以使用右侧方法进行模拟。
实现继承的方式
继承的正确操作:
Student.prototype = Object.create(Person.prototype);
Object.create()