手机版

js中基于原型和继承的一些想法

时间:2021-09-07 来源:互联网 编辑:宝哥软件园 浏览:

最近看了一个别人写的js类库,突然对js中的原型和继承有了一些想法。之前也看了一些内容,但是不是很清楚。这几天,我利用空闲时间去了解这一块,但还是觉得有问题,思维也没有那么有条理,只是为了分享。

一.实例f

JavaScript中有一个instanceof运算符,它是一个二进制运算符。使用方法instanceA instanceof A,返回值为boolean,意思是判断instanceA是否是A的实例,其本质是判断A . prototype==instance A . _ _ proto _ _,如

函数F2(){ var f=function()} { var test=new f();console . log(f的测试实例);//true console . log((f . prototype===test。_ _ proto _ _);//true}以上两个指纹都是真的。解释测试是f的一个实例;测试的__proto__属性指向F的原型对象,即F的原型属性是一个对象,这个对象是F的一个实例.

第二,js中的对象

在js中,一切都是对象,对象分为函数对象和普通对象。常用的函数实际上是函数对象,例如

//函数对象var f=function(){ } var F2=new function(' str ',' console . log(str)')function F3(){ }//公共对象var o=new Object();Var o2={} var o3=new f()如上图,f、f2、f3为函数对象,o、o2、o3为普通对象。

函数对象和普通对象的区别:

新function()创建的所有对象都是函数对象,F和f3是新Function()创建的。

定义对象时,包含一些预定义的属性,如prototype和__proto__,其中prototype属性只对函数对象可用,__proto__对所有对象都可用,因此可以通过其__proto__属性来判断一个对象是函数对象还是普通对象,如

//函数对象var f=function(){} //普通对象var o=new Object();console . log(f . protocol);//Object { } console . log(o . prototype);//undefined从上面可以得出,函数对象有prototype属性,而普通对象的prototype对象是未定义的。

第三,原型链

从上面,我们知道所有对象都有一个__proto__属性,它指向创建它的函数对象的原型对象原型。我们称这个链为用__proto__属性串成的原型链,例如,下面是一个原型链。

上图以人为例说明原型链。

var person=function(){ } var person 1=new person();1.person是一个函数对象,person1是person的一个实例

2.person1的__proto__属性是原型对象person。原型

3.作为原型对象人。prototype是一个对象,它也有一个__proto__属性,指向object的原型对象Object.prototype。

4.原型对象对象。原型是一个对象,它也有一个_ _ prototype _ _属性,这个属性的原型对象为空。

第四,一些传承

在js中,我们将定义一个函数对象,例如

Var person=function(){}上面我们定义了一个function对象,它没有属性,是一个空对象。因为它是一个对象,所以可以向它添加属性。

Var person=function () {} person。name1=' js' console.log (person。name1)//js上面的代码给person添加了一个name属性,赋值为js,name属性的值可以打印出来。然而,当我们创建一个person的实例时,person1如下所示。

var person=function(){ };person.name1=122console . log(person . name 1);var person 1=new person();console . log(person 1 . name 1);//undefined可以看到person1没有name1属性,那么如何保证person的实例也有name1属性呢?

var person=function(){ };person.name1=122//使用prototype对象给对象添加属性,这样所有实例都会有这个属性person . prototype . name 1=' 12 ';console . log(person . name 1);var person 1=new person();console . log(person 1 . name 1);//12上面使用了person.protoype.name1='12 ',所以所有实例都有name1属性。以这种方式添加的属性在生成实例时将被视为实例的公共属性。

以上基于js中原型和继承的思想都是边肖分享的内容,希望能给大家一个参考和支持。

版权声明:js中基于原型和继承的一些想法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。