Head First JS阅读笔记之 自定义对象

本文探讨了JavaScript中构造函数使用this定义方法的问题,包括方法过载及其解决方案——通过类拥有的实例方法实现方法共享,并介绍了类特性和方法的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义对象

object = property + method

我们使用this定义方法会有什么问题?
如何去解决?

Tablepropertymethod
classclass.prototype.proprtyclass.method
class-owned instanceclass.prototype.method = function(){}
instancethis.propertythis.method =
function(){}

Q1: 我们在构造函数中使用this来定义方法会有什么问题?

js的对象有两个非常重要的概念:对象类 class 和 对象实例 instance

对象类就是模板,是抽象的,描述了对象的property和method
对象实例是实际的对象,是具体的,把真正的数据放入了property。也就是说,instance的不同之处在于:每一个instance都是有自己的property副本的(instance property)。

如果在对象的构造函数里面使用this来创建method的话,

this.functionName = function(parameters){
  function_body
}

那么在每一个instance里面,都会创建新的同样的method副本,就会出现方法过载的情况。

显然,method应该为对象所共享,所有的instance所指向的应该都是同一个method副本。也就是说,对于每一个对象来说,有独立的property副本,有共享的method副本。

instance property/method 实例特性/方法很容易区分,它们在构造函数中都是使用关键字this来创建。

Q2:我们如何去解决? class-owned instance method

如何创建共享的的方法?—–>类拥有的实例方法class-owned instance method
此时,method是存储在类里面,所有的实例共享这一份method代码,method可以访问实例特性。

如何实现?—–>用prototy来模拟类
通过每一个对象的隐藏对象prototype(以特性存在)来存储method,每一个instance可以调用,但是在类里面运行。

prototype创建类方法时,不再像this放在构造函数里面,而是放到了构造函数的外面,这里要注意。

显然,class 与instance之间的沟通就是通过prototype和constructor
构造函数负责设定实例的一切事项
原型处理类层的一切事项

实例是个变量


Q3:类特性和类方法 class instance/method

instance有特性和方法,联想到类应该也有自己的特性和方法,前面已经提了类拥有的方法,下面说类特性 class property

类特性也是一份特性,实例共享,使用prototype创建
和全局变量之间的差异在于,类特性必须透过实例被访问,要使用关键字this和点号,
但是还是要和instance 的this区分开,一个在构造函数外,一个在构造函数内。

类特性和实例特性之间的差异在于存储地点,一个在类里面,一个在实例里面

Object.prototype.property = "String"
Object.prototype.functionName = function(params){
    this.property 
    }

类方法 vs 类拥有的实例方法
类方法 class method 为类所有但无法访问实例特性
类拥有的实例方法 class-owned instance method 类所有但能访问实例特性
这两种方法可以参考java类里面的private方法和protected方法
类方法就是private的那种,只有类自己可以访问类的内部
类拥有的是protected的那种

类方法

class_name.class_method = function(){}

类方法里面不能有this

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值