理解js中是原型链? 如何实现继承?

JavaScript035

理解js中是原型链? 如何实现继承?,第1张

1.每个构造函数都有一个原型对象

2.每个原型对象都包含一个指向构造函数的指针

3.每个实例都包含一个指向原型对象的指针

4.查找方式是一层层向上查找直至顶层Object.prototype

1.原型链继承

2.借用构造函数(call,apply)

3.组合继承(原型链+构造函数)

4.原型式继承

5.寄生式组合式继承

每一种继承的方式都有自己的优缺点

组合继承的特点是会调用构造函数两次,

都是将多种继承方式组合到一起相辅相成.

1.创建一个空的对象

2.将空的对象的proto成员指向构造函数的prototype成员对象

3.调用构造函数将this指向前面创建的对象

js继承有5种实现方式:

1、继承第一种方式:对象冒充

function Parent(username){

this.username = username

this.hello = function(){

alert(this.username)

}

}

function Child(username,password){

//通过以下3行实现将Parent的属性和方法追加到Child中,从而实现继承

//第一步:this.method是作为一个临时的属性,并且指向Parent所指向的对象,

//第二步:执行this.method方法,即执行Parent所指向的对象函数

//第三步:销毁this.method属性,即此时Child就已经拥有了Parent的所有属性和方法

this.method = Parent

this.method(username)//最关键的一行

delete this.method

this.password = password

this.world = function(){

alert(this.password)

}

}

var parent = new Parent("zhangsan")

var child = new Child("lisi","123456")

parent.hello()

child.hello()

child.world()

2、继承第二种方式:call()方法方式

call方法是Function类中的方法

call方法的第一个参数的值赋值给类(即方法)中出现的this

call方法的第二个参数开始依次赋值给类(即方法)所接受的参数

function test(str){

alert(this.name + " " + str)

}

var object = new Object()

object.name = "zhangsan"

test.call(object,"langsin")//此时,第一个参数值object传递给了test类(即方法)中出现的this,而第二个参数"langsin"则赋值给了test类(即方法)的str

function Parent(username){

this.username = username

this.hello = function(){

alert(this.username)

}

}

function Child(username,password){

Parent.call(this,username)

this.password = password

this.world = function(){

alert(this.password)

}

}

var parent = new Parent("zhangsan")

var child = new Child("lisi","123456")

parent.hello()

child.hello()

child.world()

3、继承的第三种方式:apply()方法方式

apply方法接受2个参数,

A、第一个参数与call方法的第一个参数一样,即赋值给类(即方法)中出现的this

B、第二个参数为数组类型,这个数组中的每个元素依次赋值给类(即方法)所接受的参数

function Parent(username){

this.username = username

this.hello = function(){

alert(this.username)

}

}

function Child(username,password){

Parent.apply(this,new Array(username))

this.password = password

this.world = function(){

alert(this.password)

}

}

var parent = new Parent("zhangsan")

var child = new Child("lisi","123456")

parent.hello()

child.hello()

child.world()

4、继承的第四种方式:原型链方式,即子类通过prototype将所有在父类中通过prototype追加的属性和方法都追加到Child,从而实现了继承

function Person(){

}

Person.prototype.hello = "hello"

Person.prototype.sayHello = function(){

alert(this.hello)

}

function Child(){

}

Child.prototype = new Person()//这行的作用是:将Parent中将所有通过prototype追加的属性和方法都追加到Child,从而实现了继承

Child.prototype.world = "world"

Child.prototype.sayWorld = function(){

alert(this.world)

}

var c = new Child()

c.sayHello()

c.sayWorld()

5、继承的第五种方式:混合方式

混合了call方式、原型链方式

function Parent(hello){

this.hello = hello

}

Parent.prototype.sayHello = function(){

alert(this.hello)

}

function Child(hello,world){

Parent.call(this,hello)//将父类的属性继承过来

this.world = world//新增一些属性

}

Child.prototype = new Parent()//将父类的方法继承过来

Child.prototype.sayWorld = function(){//新增一些方法

alert(this.world)

}

var c = new Child("zhangsan","lisi")

c.sayHello()

c.sayWorld()

一,先来说说javascript的继承机制的几种方式:1,原型链继承:优点:从instanceof关键字来看,实例既是父类的实例,又是子类的实例,看起来似乎是最纯粹的继承。缺点:子类区别于父类的属性和方法,必须在Sub.prototype = new Base()这样的语句之后分别执行,无法被包装到Sub这个构造器里面去。例如:Sub.prototype.name = “sub”;无法实现多重继承。2,构造继承:优点:可以实现多重继承,可以把子类特有的属性设置放在构造器内部。缺点:使用instanceof发现,对象不是父类的实例。3,实例继承:优点:是父类的对象,并且使用new构造对象和不使用new构造对象,都可以获得相同的效果。缺点:生成的对象实质仅仅是父类的实例,并非子类的对象;不支持多继承。4,拷贝继承:优点:支持多继承。缺点:效率较低;无法获取父类不可枚举的方法。二,java继承机制:1,java里的类不能多重继承,如果一个类一旦继承了它的父类,那么它就别想再继承别的类。一个儿子只能有一个老爸,原本设计是没错的。可是在实际应用中,就会出现各种问题。2,java里有更好的接口,接口从本质上来说可以更好的代替继承。实现像C++里一样的宏定义的功能,把你想要的东西都抽象在接口里,让具体的类去实现这些功能。三,综上可以看出java不能多继承,javascript可以,但是javascript没有接口这一说话,也有局限性,各有千秋吧。