A1—浅谈JavaScript中的原型(二)

来源:互联网 发布:法瑞尔威廉姆斯 知乎 编辑:程序博客网 时间:2024/05/16 12:06


A1—浅谈JavaScript中的原型(二)

原型是什么?想要了解这个问题,我们就必须要知道对象。

对象

根据w3cschool上的介绍:对象只是带有属性和方法的特殊数据类型。

我们知道,数组是用来描述数据的。其实呢,对象也是用来描述数据的。只不过有一点点的区别,那就是数组的下标只能是数字。所以,数组最好只用来装同样意义的内容。比如说[1,2,3,4,5]或者[“a”,”b”,”c”,”d”,”e”]等。因为他们的表达的含义是一样的。那么如何表达含义不一样的内容呢?[“小明”,12,”男”]这样的内容。鬼知道它要表达什么啊!所以,由于数组的下标只能是数字。无法准确的表达每一项的含义。于是乎,对象出现了。

对象=> { “name”:”小明”,”age”:12,”sex”:”男”}。对象就是由各种key:value对组成的数据结构。

看,数组[“小明”,12,”男”]与对象{ “name”:”小明”,”age”:12,”sex”:”男”}都有相同的值。只不过对象表达的更清晰。更能让人知道每一个数据表达的含义是什么!

我们上面的对象,很明显的想要描述一个人的各项信息。那么能不能描述一下这个人能做的事情呢?比如说:“唱歌”“读书”。

当然可以!

{

“name”:”小明”,

”age”:12,

”sex”:”男”,

”sing”:function{

console.log(“我在唱歌”);

},

”read”:function{

console.log(“我在读书”);

}

}看,通过上面这样一组一组的key:value对就能够清晰的表达一个人的各项属性和方法

属性:对象的key对应的东西都叫做属性。方法:(接上句)但是,如果这个key对应的是一个函数,那么我们叫它方法。

好了,现在我们知道什么叫对象以及对象可以拥有方法。那么在JavaScript中我们想要创建多个相似的对象该怎么办呢?很明显,我们不是一条一条写出来的。

我们知道,在JavaScript中,函数的作用是复用代码。而定义一个对象其实就是一条条代码组成的。那么我们可以这样写。

function createPeople{

var obj = {

“name”:”小明”,

”age”:12,

”sex”:”男”,

”sing”:function{

console.log(“我在唱歌”);

},

”read”:function{

console.log(“我在读书”);

}

}

}

看,我们使用函数来简化了代码的书写。这样每当我们调用一次函数就能够创建一个“小明”出来。可是我们如果创建的对象的属性值不一样,该怎么办呢?

思考:简单,函数不是可以传递参数吗?

我先把函数内部的对象的所有属性都定义成形参。然后当函数调用的时候传递实参就可以了呀!

代码如下:

function createPeople(name,age,sex){

var obj = {

“name”:name,

”age”:age,

”sex”:sex,

”sing”:function{

console.log(“我在唱歌”);

},

”read”:function{

console.log(“我在读书”);

}

}

}

现在好了,我们每执行一次函数并传递不同的参数,就可以获得到不同的对象了。

createPeople(“小明”,12,”男”);=>得到一个小明对象

createPeople(“小红”,12,”女”);=>得到一个小红对象

但是!!!!!!!!

发现没有?????

每调用一次createPeople函数,我们就会定义两个新的函数:sing和read。并且定义完毕之后会被这个对象的属性引用。那么这样的话我们创建了小明和小红,就会在内存中开辟4个地址。

分别存放小红.sing、小红.read、小明.sing、小明.read。

而小红.sing和小明.sing的功能是一模一样的。小红.read和小明.read方法也是一模一样的。这不科学!!!!!!

现在我们只是调用了两次createPeople,就会创建四个新的函数。那么如果调用二十次呢?如果每个对象不仅仅只有两个方法呢?

我们知道函数的使命就是让代码被复用。可是,却出现了每一个对象都有一个自己的方法这种情况。这样将会造成内存的极大浪费!

也就是说:

小明.sing===小红.sing的结果为false

那我们就想:要是能提取出来就好啦!

当然可以!

function createPeople(name,age,sex){

var obj = {

“name”:name,

”age”:age,

”sex”:sex,

”sing”:sing,

”read”:read

}

}

function sing{

console.log(“我在唱歌”);

}

function read{

console.log(“我在读书”);

}

发现没有?我们成功的将所有的对象的方法,都提取出来了,这样不管创建多少对象。都仅仅会在内存中有一个地址。也即是说

createPeople(“小明”,12,”男”);=>得到一个小明对象

createPeople(“小红”,12,”女”);=>得到一个小红对象

此时:小红.sing ===小明.sing结果为true

但是,如果方法一旦多了,就会在全局作用域下造成污染。全局作用域中会出现好多的变量。所以再进一步简化:

function createPeople(name,age,sex){

var obj = {

“name”:name,

”age”:age,

”sex”:sex,

”sing”:peopleMethod .sing,

”read”:peopleMethod .read

}

}

var peopleMethod = {

sing: function {

console.log(“我在唱歌”);

},

read:function {

console.log(“我在读书”);

}

}

好了,现在不怕污染全局作用域了。(虽然还是会有一个全局变量,但是已经比之前好多了不是吗)

那么,根据这个原理,小明调用的sing方法,其实是peopleMethod的sing方法。

小红调用的sing方法其实也是peopleMethod的sing方法。

这样的话我们可以说小明和小红的方法都是peopleMethod的。

那也就可以说,

peopleMethod是小明和小红的方法对象。

而JavaScript就在设计之初,将这个对象放在了构造函数上。

这样从构造函数构造出来的对象,就会共享原型上的方法。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 武汉科目四考试居住证过期了怎么办 农行卡密码输错3次怎么办 驾照罚款缴纳了网上没消怎么办 外地驾驶证分数扣12分了怎么办 有生产日期的赠品在超市过期怎么办 6年免检车辆逾期未年检怎么办 行驶证检验有效期过期2年怎么办 骑摩托车忘带驾驶证和行驶证怎么办 驾驶证逾期未审验怎么办有什么后果 车祸至人腿部骨折沒钱偿还的怎么办 我有c4驾驶证想办c3怎么办 驾驶证和行驶证被交警扣了怎么办 行驶证被交警弄丢了怎么办 没带行驶证让警察发现怎么办 首尔转机换票换乘怎么办过境签证 驾驶证约考帐号与登密码丢失怎么办 考驾照的时候预约密码忘了怎么办 考驾照的预约密码忘了怎么办 摩托车不能挂档不能摘挡了怎么办 身份证丢失了派出所不给挂失怎么办 快递员在中午还送货夏天怎么办啊 驾照一个记分周期扣满12分怎么办 佛山南海车管所怎么办替人消分流程 福州快处中心几流程要怎么办 被对方追尾了对方只有交强险怎么办 摩托车行驶证年检过期一年半怎么办 户口迁到杭州了身份证掉了怎么办 户口已迁至外面要补办结婚证怎么办 汽车年检时间过了1个月怎么办 户口在老家在北京工作怎么办招工 报考驾照时手机号留错了怎么办 合肥驾照换证体检没过怎么办 驾驶证记分周期到了违章未消怎么办 驾照被扣科目一过期没考怎么办 驾驶证暂扣过了换证日期怎么办? 考驾照科目二身份证丢了怎么办 驾照科目一考试身份证丢了怎么办 换驾驶证名下有车辆脱审怎么办 交警把驾驶证和行车证扣了怎么办 连续两天驾照都是扣12分怎么办? 交警开的电动车罚单丢了怎么办