大家好,今天小编来为大家解答深入解析:面向对象编程中的函数继承方法这个问题,很多人还不知道,现在让我们一起来看看吧!
这时候cat1就会自动包含一个constructor属性指向它们的构造函数。那是猫
js还提供了instanceof运算符来验证原型对象和实例对象之间的关系
console.log(cat1 instanceof Cat) //将打印出true
2.constructor的不足
如果给Cat 对象添加一个不变的属性和方法,例如类型为‘cat’,方法为‘eat Mouse’,那么对于每个实例对象,类型属性和eat() 方法是完全相同的相同。每次生成实例,必然是重复的内容,占用较多的内存。那么就会出现浪费内存的问题,因为栈(一个比较模糊的概念)指向的地址不在同一个地址。
有没有办法让这个方法在同一个内存中,实例对象访问并继承这个方法。答案如下
3.prototype
Javascript规定每个构造函数都有一个prototype属性(只有函数才有prototype属性,当函数作为构造函数被调用时,函数使用这个属性创建一个新对象),指向另一个对象。该对象的所有属性和方法都会被构造函数的实例继承(即可以访问且地址相同)。
为了配合prototype属性,js有以下辅助方法来查看prototype对象和实例对象的关系。
isPrototypeOf() 方法用于确定原型对象和实例之间的关系。
console.log(Cat.prototype.isPrototypeOf(cat1)) //输出为true
hasOwnProperty() 每个实例对象都有一个hasOwnProperty() 方法,该方法用于判断某个属性是本地属性还是从原型对象继承的属性。
console.log(cat1.hasOwnProperty("name"))//true
console.log(cat1.hasOwnProperty("type"))//false
4.继承
4.1 构造函数绑定
使用call或apply方法将父对象的构造函数绑定到子对象
如何让猫继承动物的属性
只需使用prototype属性添加一个apply4.2
如果Cat的prototype属性指向Animal的一个实例,那么所有Cat的实例都可以继承Animal
因为每个构造函数都有一个指向地址的原型对象,所以它们的实例可以访问和继承。 (实例的构造函数指向原型对象)
Cat.prototype=new Animal();这行代码的意思是,Cat的原型对象只是Animal的一个实例,之前的Cat原型对象被彻底删除,并被赋予了新的值。
Cat.prototype.constructor=Cat;这行代码意味着任何prototype对象都有一个constructor属性指向它的构造函数(意思是cat1.constructor指向Cat,而Cat指向Animal),如果没有“Cat.prototype=new Animal();”然后Cat.prototype.constructor 指向Cat,但添加该行指向Animal。 console.log(Cat.prototype.constructor==Animal) 为true,这显然会导致继承链混乱(cat1 显然是使用构造函数Cat 生成的)。
4.3 直接继承prototype
第三种方法是第二种方法的改进。 Animal对象中的不变属性可以写入prototype属性中,所以我们可以让Cat()跳过Animal()直接继承Animal.prototype
缺点也很明显。如果Cat.prototype被修改,Animal.prototype也会被修改,因为Cat.prototype.constructor=Cat。
此时它指向Animal。例如,console.log(Animal.prototype.constructor) 将结果打印为Cat
4.4 使用空对象作为中介
由于上述缺点,可以使用空对象作为中介,因为空对象几乎不占用内存。
打印结果如下
5.非构造函数的继承
如果有两个普通对象而不是构造函数,例如一个Chinese对象和一个Doctor,Doctor如何继承Chinese的china属性值?
5.1 对象函数
您可以使用object() 函数
打印结果是china。事实上,object() 函数只做了一件事。它将子对象的prototype属性指向父对象,这样子对象就可以访问父对象的属性和方法。对象函数返回一个构造函数,因此转换结果与之前相同。
5.2 浅拷贝
这种抄袭其实是有问题的。如果父对象的属性是数组或者其他对象,那么子对象实际获取到的只是一个内存地址。如果子对象的属性和属性值被修改,父对象也会被修改。在没有完成真正的复制的情况下,如果给中文加上一个“出生地”属性,那就是一个数组了。
因此,extendCopy()仅复制基本类型的数据。我们将此副本称为“浅副本”。
5.3 深拷贝
所谓‘深拷贝’就是能够实现数组和对象的真实拷贝。它的实现并不困难,只要递归调用‘浅拷贝’即可。
因为遍历birthPlaces时会递归调用deepCopy函数,所以console.log(c)会打印两次结果。
深入解析:面向对象编程中的函数继承方法和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
【深入解析:面向对象编程中的函数继承方法】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于遇到一个关于构造函数继承的帖子了!我一直对这块不太懂。
有16位网友表示赞同!
什么时候学到这种高级的继承方式?
有16位网友表示赞同!
这样可以把父类的一些属性和方法直接拷贝过来吗?
有19位网友表示赞同!
这个应用场景还挺广泛的,比如我们写一些复杂类的模板啊什么的
有15位网友表示赞同!
请问构造函数继承和普通继承的区别在哪里呢?
有20位网友表示赞同!
学习一下构造函数继承,感觉代码写的更优雅一点
有19位网友表示赞同!
这块知识点在实际项目中运用得非常多吧?
有9位网友表示赞同!
听起来比普通的继承方式更高效一些吗?
有15位网友表示赞同!
能分享一下使用构造函数继承的案例,想具体看看操作方法。
有9位网友表示赞同!
我感觉学习这种高级的概念需要比较强的代码基础啊!
有16位网友表示赞同!
这种继承方式可以解决什么问题呢?
有7位网友表示赞同!
听起来很有意思,等我把其他知识点学完再试试这个构造函数继承吧!
有12位网友表示赞同!
有没有一些推荐的教程或者文档,可以让新手更容易理解构造函数继承?
有17位网友表示赞同!
好像有些语言并不支持构造函数继承,是吗?
有14位网友表示赞同!
我能用这种方式来实现多重继承吗?
有17位网友表示赞同!
学习这块知识点可以让我写出更高级的代码啊!
有10位网友表示赞同!
我感觉了解构造函数继承可以让我的编程思路更清晰化。
有11位网友表示赞同!
这个话题比较抽象,能不能用更简明易懂的方式来解释?
有19位网友表示赞同!