javascript核心技术(四十四)面向对象(二) 构造函数的原型对象

[复制链接]
查看: 1164|回复: 31
发表于 2023-1-28 12:49:29 | 显示全部楼层 | 阅读模式
通过上面的讲解,大家应该明白了如何创建一个构造函数,但是,那样创建的构造函数有一个问题。
那就是:每次我们new这个函数时它就会在内存中创建出一个副本,每个副本都存储在不同的内存空间中,也就是说:多次new同一个构造函数,得到的实例对象是完全不同的多个实例对象。
举例来说明一下:
<!DOCTYPE html>
<html>
<head>
        <title>面向对象(二) 构造函数的原型对象</title>
</head>
<body>
        <script type="text/javascript">
                function Person(n, a){
                this.name = n;
                this.age = a;
                this.say = function(){
                        console.log('我叫' + this.name);
                        }
                }
                var person1 = new Person('tom',33);
                var person2 = new Person('tom',33);
                console.log(person1==person2);
        </script>
</body>
</html>

javascript核心技术(四十四)面向对象(二) 构造函数的原型对象

通过以上代码可以看到,即使我们new的时候给构造函数传入相同的参数,两次new出来的实例对象都是完全不同的两个东西。
也就是说:如果我们用一个循环重复执行new都能把内存给占满了,这是一件可怕的事情。

所以,在JS官方没有给出解决方法之前,民间是这样做的
 
<!DOCTYPE html>
<html>
<head>
        <title>面向对象(二) 构造函数的原型对象</title>
</head>
<body>
        <script type="text/javascript">
        var fn = function(){
                console.log('我叫' + this.name);
        };
        function Person(n, a){
                this.name = n;
                this.age = a;
                this.say = fn;
        }
        var person1 = new Person('张三', 30);
        var person2 = new Person('李四', 40);
        console.log(person1);
        console.log(person2);
        </script>
</body>
</html>


以上代码中,我们把构造函数中的方法写到构造函数外面,在构造函数中把外面的函数名赋值给构造函数的方法。
由于普通函数仅在内存的堆空间中存储一份,而且构造函数的的属性占用的栈空间极小,所以这就解决了内存浪费的问题。

但是,这依然存在一个问题,如果一个构造函数的方法特别多,而且我们还有很多构造函数,这样写的话命名是个问题,弄不好就命名冲突了。
所以,民间又想出这样一个办法
 
<!DOCTYPE html>
<html>
<head>
        <title>面向对象(二) 构造函数的原型对象</title>
</head>
<body>
        <script type="text/javascript">
        var obj = {
                "fn":function(){
                        console.log('我叫' + this.name);
                },
                "fn2":function(){
                        console.log('我走的很快');
                }
        };
        //构造函数中,给每个人直接定义方法(从公共对象中取)
        function Person(n, a){
                this.name = n;
                this.age = a;
                this.say = obj.fn;
                this.walk = obj.fn2;
        }
        </script>
</body>
</html>

以上代码中,我们把构造函数的所有方法写到外部的一个字面量对象中,这样就隔离了公用空间。如果是多个构造函数,我们就在外部定义多个字面量对象,分别存放每个构造函数的方法。
然后将外部对象中的方法赋值个构造函数的方法。
这样做似乎比较完美了,但是毕竟是民间的,实现起来有点麻烦。

此时JS官方终于给出一个解决方案,那就是构造函数的原型对象,即构造函数.prototype所指向的对象,这个prototype相当于民间的外部字面量对象名称。
请看下面的代码
<!DOCTYPE html>
<html>
<head>
        <title>面向对象(二) 构造函数的原型对象</title>
</head>
<body>
        <script type="text/javascript">
        function Person(n, a){
                this.name = n;
                this.age = a;
        }
        Person.prototype.say=function(){
                        console.log('我走的很快');
                };
        var person=new Person('tom',33);
        person.say();
        </script>
</body>
</html>

javascript核心技术(四十四)面向对象(二) 构造函数的原型对象

实例对象同样正常使用了say方法。

所以,再次重复,构造函数.prototype就是构造函数的原型对象,请不要嫌我啰嗦,因为即使我不停的重复,讲着讲着可能很多人就分不清楚了。

本节就先讲到这里,请大家务必认真理解以上内容后再继续下面的学习。


易博软件介绍

0

主题

18

帖子

10

积分

营销入门

Rank: 2

积分
10
发表于 2023-2-21 07:53:18 | 显示全部楼层
我很欣赏你这么说  其实这是每个编程的人应该知道的

0

主题

15

帖子

8

积分

营销入门

Rank: 2

积分
8
发表于 2023-3-5 10:21:38 | 显示全部楼层
没什么  我只是一个大专生  相信让我出题的话同样范畴的题我也可以不他考住  没有两个人的思维是一样的  很简单的道理  他的想法不可能和我的想法一样

0

主题

6

帖子

3

积分

营销入门

Rank: 2

积分
3
发表于 2023-3-15 19:00:19 | 显示全部楼层
呵呵!  我又重新看了一遍你的贴子1  我刚才还在抱怨公司要求我写程序注意效率!  我现在正在改一个改不出来!  正在苦恼中1、  看来觉得公司说得很对!  谢谢你!楼主!

0

主题

18

帖子

10

积分

营销入门

Rank: 2

积分
10
发表于 2023-3-24 07:23:53 | 显示全部楼层
写的非常棒。感触很深!

0

主题

37

帖子

20

积分

营销入门

Rank: 2

积分
20
发表于 2023-3-30 09:26:11 | 显示全部楼层
^其实不光是计算机编程,其他学术方面也有同样问题,大学,中学,甚至小学教学都只是完成任务式的教育从不理会学生该怎么样,这是中国教育体制问题

2

主题

160

帖子

84

积分

终身会员

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
84

终身会员

发表于 2023-4-4 11:41:29 | 显示全部楼层
醒悟中~~~
发表于 2023-4-9 23:48:16 | 显示全部楼层
感触很深

0

主题

9

帖子

5

积分

营销入门

Rank: 2

积分
5
发表于 2023-4-14 13:43:39 | 显示全部楼层
感受很深不知同我这样的菜鸟何时才能展翅高飞哎。。。。。。。

0

主题

30

帖子

16

积分

营销入门

Rank: 2

积分
16
发表于 2023-4-19 14:51:57 | 显示全部楼层
确实不错!很负责哟!   
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表