摘要:而这个原型对象作为这个构造函数的一个属性,是被其创建出来的所有实例共享的。
构造函数创建对象带来的问题
上一篇文章介绍了JavaScript创建对象的几种方法,都有各自的优缺点。
构造函数看起来好像很好,但是它也有一个问题,那就是创建出来的每一个实例对象的方法都是一个独立的函数,即使他们的内容是完全相同的,这是不符合函数的代码复用原则的,而且也不能够统一的修改已被创建的实例的方法。
function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; this.introduce = function () { console.log("我叫" + this.name + ", 今年" + this.age + "岁."); }; } var jerry = new Person("Jerry", "21", "M"); var julia = new Person("Julia", "27", "F"); console.log(jerry.introduce === julia.introduce); // false
上述代码中的jerry对象和julia对象的introduce()方法是两个独立的函数,数据不共享,如果对象创建更多就浪费了大量的内存空间。
JavaScript原型解决方案在 JavaScript 中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。其中每个函数对象都有一个 prototype 属性,这个属性指向函数的原型对象。
那么,这个原型对象有什么作用呢?
构造函数是一个函数对象,所以就会有一个 prototype 属性,也就有了一个原型对象,既然这是一个对象,那么久可以为它添加属性和方法。而这个原型对象作为这个构造函数的一个属性,是被其创建出来的所有实例共享的。
所以上面的代码我们可以这样改写
function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; } Person.prototype.introduce = function () { console.log("我叫" + this.name + ", 今年" + this.age + "岁."); }; var jerry = new Person("Jerry", "21", "M"); var julia = new Person("Julia", "27", "F"); console.log(jerry.introduce === julia.introduce); // true
这样就解决了数据共享的问题,达到了代码复用的目的,无论通过此构造函数创建了多少个对象,introduce 方法只会占用一份内存空间。
且可以统一修改所有 Person 构造函数创建的实例对象的 introduce 方法。
function Dog(name, age) { this.name = name; this.age = age; } Dog.prototype.play = function () { console.log("小狗玩耍"); this.bark(); }; Dog.prototype.bark = function () { console.log("小狗叫"); }; var tom = new Dog("Tom", 3); tom.play();// 小狗玩耍 小狗叫
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/94196.html
摘要:首先,需要来理清一些基础的计算机编程概念编程哲学与设计模式计算机编程理念源自于对现实抽象的哲学思考,面向对象编程是其一种思维方式,与它并驾齐驱的是另外两种思路过程式和函数式编程。 JavaScript 中的原型机制一直以来都被众多开发者(包括本人)低估甚至忽视了,这是因为绝大多数人没有想要深刻理解这个机制的内涵,以及越来越多的开发者缺乏计算机编程相关的基础知识。对于这样的开发者来说 J...
摘要:之前有朋友问怎么去理解原型和原型链的问题。理解原型链的小技巧将箭头视作泛化子类到父类关系那么图中所有的虚线将构成一个继承层级,而实线表示属性引用。原型链是实现继承的重要方式,原型链的形成是真正是靠而非。 之前有朋友问怎么去理解原型和原型链的问题。这个问题,在面试中,很多同学经常都会遇到。这里给大家讲讲,方便大家记忆。 JavaScript的特点JavaScript是一门直译式脚本...
摘要:之前有朋友问怎么去理解原型和原型链的问题。理解原型链的小技巧将箭头视作泛化子类到父类关系那么图中所有的虚线将构成一个继承层级,而实线表示属性引用。原型链是实现继承的重要方式,原型链的形成是真正是靠而非。 之前有朋友问怎么去理解原型和原型链的问题。这个问题,在面试中,很多同学经常都会遇到。这里给大家讲讲,方便大家记忆。 JavaScript的特点JavaScript是一门直译式脚本...
摘要:如下所示在规范中,已经正式把属性添加到规范中也可以通过设置和获取对象的原型对象对象之间的关系可以用下图来表示但规范主要介绍了如何利用构造函数去构建原型关系。 前言 在软件工程中,代码重用的模式极为重要,因为他们可以显著地减少软件开发的成本。在那些主流的基于类的语言(比如Java,C++)中都是通过继承(extend)来实现代码复用,同时类继承引入了一套类型规范。而JavaScript是...
摘要:在最开始的时候,原型对象的设计主要是为了获取对象的构造函数。同理数组通过调用函数通过调用原型链中描述了原型链的概念,并将原型链作为实现继承的主要方法。 对象的创建 在JavaScript中创建一个对象有三种方式。可以通过对象直接量、关键字new和Object.create()函数来创建对象。 1. 对象直接量 创建对象最直接的方式就是在JavaScript代码中使用对象直接量。在ES5...
摘要:并没有类继承模型,而是使用原型对象进行原型式继承。我们举例说明原型链查找机制当访问一个对象的属性时,会从对象本身开始往上遍历整个原型链,直到找到对应属性为止。原始类型有以下五种型。此外,试图查找一个不存在属性时将会遍历整个原型链。 Javascript 并没有类继承模型,而是使用原型对象 prototype 进行原型式继承。 尽管人们经常将此看做是 Javascript 的一个缺点,然...
阅读 2781·2023-04-25 17:59
阅读 647·2023-04-25 15:05
阅读 602·2021-11-25 09:43
阅读 2993·2021-10-12 10:13
阅读 3499·2021-09-27 13:59
阅读 3512·2021-09-23 11:21
阅读 3756·2021-09-08 09:35
阅读 517·2019-08-29 17:12