自定义对象
object = property + method
我们使用this定义方法会有什么问题?
如何去解决?
Table | property | method |
---|---|---|
class | class.prototype.proprty | class.method |
class-owned instance | class.prototype.method = function(){} | |
instance | this.property | this.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