当前位置:首页 > Web开发 > 正文

接受两个参数: 1.一个用做新对象原型的对象([[prototype]]__proto__可选) 2.第二个参数是一个用

2024-03-31 Web开发

要彻底弄大白js中的担任,我们首先要弄清楚js中的一个很重要的观点那就是原型链。

1.什么是原型链?

我们知道每个结构函数都有一个原型东西,原型东西包罗一个指向结构函数的指针,而实例都包罗一个指向原型东西的内部指针。如果,让原型东西即是另一个引用类型的实例,那么原型东西中将包罗一个指向另一个原型的指针,相应地,另一个原型东西中包罗着一个指向另一个结构函数的指针。假如另一个原型东西又是另一个引用类型的实例,那么上述关系依然创立,如此层层递进,就组成了实例与原型之间的链条。这就是所谓原型链的根基观点。关键就是让原型即是另一个引用类型的实例。

2.默认原型

我们知道,所有引用类型默认都担任了Object,而这个担任也是通过原型链来完成的。记住:所有函数的默认原型都是Object的实例,因此默认原型都包罗一个内部指针,指向Object.prototype.这也是所有自界说类型城市担任toString(),toValue()等要领的根来源根底因。

3.确定原型和实例之间的关系

1.使用instanceof操纵符,只要用这个操纵符来检测实例与原型链中呈现过的结构函数,功效就会返回true

2.使用isPrototypeOf(),只要是原型链中呈现过的原型,都可以说是原型链中所派生出来的实例的原型,功效就会返回true。

 4.谨慎地界说要领

子类型有时候需要笼罩超类中的某个要领,或者需要添加超类中不存在的某个要领。但不管怎样,给原型添加的要领必然要放在替换原型的语句之后,在通过原型实现担任时,不能使用东西字面量创建原型要领,因为这样做会重写原型,堵截实例与原型之间的连接关系。

5.原型链的问题

引用类型值的原型属性会被实例共享;而这也是为什么要在结构函数中,而不是在原型东西中界说属性的原因。在通过原型实现担任的时候,原型实际上是酿成另一个类型的实例,于是,原先的实例属性顺理成章地酿成了此刻的原型属性了。

下面代码可以说明这个问题:

function SuperType() { this.colors = [‘red‘, ‘orange‘, ‘green‘]; } function SubType() { } // 担任Supertype SubType.prototype = new SuperType(); var instance1 = new SubType(); instance1.colors.push(‘black‘); console.log(instance1.colors); // [‘red‘,‘orange‘,‘green‘,‘black‘] var instance2 = new SubType(); console.log(instance2.colors); // [‘red‘,‘orange‘,‘green‘,‘black’]

在这里我们把SubType的原型指向SuperType的一个实例,由于SuperType只实例了一次,所以实例instance1和instance2共享了colors属性,导致一变多变的现象呈现,我们想的是每一个实例都有属于本身的一个属性副本,并不会进行彼此的滋扰。

别的,在创建子类型的实例的时候,我们无法向超类型的结构函数通报参数。

6.借用结构函数

这种技术的思想相当简单,即在子类型结构函数的内部挪用超类型的结构函数,函数只不过是在特定环境中执行代码的东西,因此通过apply,call等要领也可以执行函数。

function SuperType() { this.colors = [‘red‘, ‘orange‘, ‘green‘]; } function SubType() { // 执行超类的结构函数,为子类的每个实例单独创建一个colors属性副本 SuperType.call(this) } // 担任Supertype SubType.prototype = new SuperType(); var instance1 = new SubType(); instance1.colors.push(‘black‘); console.log(instance1.colors); // [‘red‘,‘orange‘,‘green‘,‘black‘] var instance2 = new SubType(); console.log(instance2.colors); // [‘red‘,‘orange‘,‘green‘]

如上面代码所示,我们在子类型的结构函数中执行了超类型的结构函数,这样子就为SubType的每一个实例单独创建了一个colors的属性副本,做到不彼此滋扰。

别忘了,apply个call函数除了执行函数之外,还可以通报参数,那么我们改削上面的例子,就可以实现向超类型的结构函数通报初始化参数。

代码如下:

function SuperType(name) { this.name = name } function SubType(name) { // 执行超类的结构函数,为子类的每个实例单独创建一个colors属性副本 SuperType.call(this,name); this.colors = [‘red‘]; } // 担任Supertype SubType.prototype = new SuperType(); var instance1 = new SubType(‘instance1‘); instance1.colors.push(‘black‘); console.log(instance1.name);// instance1 console.log(instance1.colors); // [‘red‘] var instance2 = new SubType(‘instance2‘); console.log(instance2.colors); // [‘red‘] console.log(instance2.name);// instance2

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30864.html