js中怎么定义一个对象保存另一个对象_JavaScript面向对象编程-封装

在现实的开发中按照传统流程编写一个一个函数来解决需求的方式,一般意义上这是一种面向过程的实现方式,这样做不利于团队开发和团队的代码维护。于是就有了另一种更适合团队的编程思想--面向对象编程。

面向对象编程就是将所需要实现的功能抽象成一个对象,然后针对这个对象分析其属性,方法。这个对象我们称之为类。而面向对象编程的一个重要特点就是封装。

在js中创建一个类,声明一个函数保存在一个变量里,然后在这个函数的内部通过this变量添加属性或者方法来实现对类添加属性或者方法,例如:

1beac2e8f1d2a61aedd9d4c719a73514.png

也可以通过在类的原型上添加属性和方法,有两种方式,一种是为原型对象属性赋值,别一种是将一个对旬赋值给类的原型对象(这两种方式不要混用),例如:

bc16baec2b7bc4655700d03e78777898.png

这样我们所需要的方法和属性都封装在我们抽象的Person类里面了,当使用功能方法时,我们通过new关键字来实例化对象再使用:

6a8e60899b3e660028e8ee219d6ffd31.png

以上通过this添加属性和方法与在prototype中添加的区别是:通过this添加的属性,方法是在当前对象上添加的,而js是一种基于原型prototype的语言,所以每创建一个对象时它都有一个原型prototype用于指向其继承的属性,方法。这样通过prototype继承的方法并不是对象自身的,所以在使用这些方法时,需要通过prototype一级一级查找得到属性方法。这样就会发现通过this定义的属性或者方法是该对象自身拥有的,所以每次通过类创建一个新的对象时,this指向的属性和方法都会得到相应的创建,而通过prototype继承的属性或者方法的属性或者方法是每个对象通过prototype访问到,所以每次通过类创建一个新的对象时这些属性和方法不会再创建。

然而在函数内部通过this创建的属性和方法,在类创建对象时,每个对象自身都拥有一份并且可以在外部访问到。因此通过this创建的属性可看作是对象共有属性和对象共有方法,由于这些方法权利比较大,我们又将它看作特权方法。在对象创建时通过使用这些特权方法我们可以初始化实例对象的一些属性,因此这些在创建对象时调用的特权方法还可以看作是类的构造器。如下例子:

cc0d5278c9f65f27a6928b6f38f33761.png

通过js函数级作用域的特征来实现在函数内部创建外界访问不到的私有变量和私有方法。通过new关键字实例化对象时,由于对类执行一次,所以类的内部this上定义的属性和方法自然就可以复制到新创建的对象上,成为对象公有化的属性方法,而其中的一些方法能访问到类的私有属性和方法,就像例子中类的成员彼此访问的权力要比外界的权力的大,因此得名特权方法。

通过new创建的新对象时,由于类外面通过点语法添加的属性和方法没有执行到,所以创建的对象中无法获取他们,但是可以通过类来使用。因此在类外通过点语法定义的属性以及方法被称为类的静态共有属性和类的静态共有方法。而类通过prototype创建的属性或者方法在类实例的对象中是可以通过this访问到的,所以我们将prototype对象中的属性和方法称为共有属性和共有方法,如:

0340267a943346c1ec9b8f37873c428d.png

通过new关键字创建的对象实质是对新对象this的不断赋值,并将prototype指向类的prototype所指向的对象,而类的构造函数外面通过点语法定义的属性方法是不会添加到新创建的对象上去的。因此 要想在新创建的对象中使用isChinese就得通过Person类使用而不能通过this,如Person.isChinese,而类的原型prototype上定义的属性在新的对象里就可以直接地使用,这是因为新对象的prototype和类prototype指向的是同一个对象。

ps:有点绕..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值