犀牛书笔记:(11)Classes, Constructors and Prototypes
在JS中创建对象往往使用new xxx()的方法,其中xxx被称为构造函数,实际过程是由new操作符创建一个空对象,然后由后面的xxx方法对该对象进行初始化。在xxx方法中,可以使用this关键字引用到。通过定义构造方法,就定义了一个类。在这种语境下,构造方法的命名通常不同于一般的方法命名(动宾)而用类命名的方式。构造函数通常没有返回值,如果有返回值,返回值将会代替之前用new生成的对象。
?
如果构造函数返回元数据,对前面初始化的对象没有影响,被赋值的变量还是可以引用到新生成的对象。只有在返回对象时,才会代替返回对象。
?
?当读取某个对象的某个属性时,JS先检查该对象是否有该属性,再检查该对象的prototype对象是否有该属性。
当写入某个对象的某个属性时,JS将不使用prototype属性。
这就是说,继承只有在读取对象属性时才发生
如果一个对象o的Prototype有一个属性k,那么o.k =4;将会先在o中寻找是否有一个属性叫k,如果没有就创建一个,并不会到prototype中去寻找。
?
一般的built-in对象比如String,Date,都可以修改其prototype,但是有些对象,比如浏览器相关的对象,就不具备这种能力。
?
?
修改built-in对象的一大作用就是,对某些浏览器没有实现的方法和功能,可以通过修改prototype对象来自己实现。
?
在JS中模拟类
每一个在constructor中创建并初始化的属性都是instance property.
创建一个instance method,就是通过设置constructor的prototype实现的。
和JAVA重要的不同是,在JAVA类中,this关键字是可以隐藏的,而JS中,必须显式的使用this关键字
定义一个属于constructor的属性来模拟class property.
borrowMethods(Colored, ColoredRectangle);?注意这里prototype.constructor需要重新设置,否则将是父类的构造器.
?
?
?
typeof null是object
typeof undefined是undefined.
typeof function是function
用instanceof来判断到底是哪种对象
?
如果需要测试某个对象属于具体哪个类,可以使用if( d.constructor == xxxx)
?
对于built-in对象,toString()方法可以反映对象的类型信息
?
DUCK Typing
if it walks like a duck and quacks like a duck, it's a duck!
如果一个对象拥有一个类的所有方法/属性,那么就说它是那个类的一个实例
?
?
?
?
?
?
?
?
?
?
?
?