js中构造函数的工作室初始化一个新创建的对象,设置在使用对象之前需要设置的所有属性,例如:
function Rectangle(w, h)
{
this.width = w;
this.height = h;
}
构造函数通常没有返回值,他们初始化作为this的值来传递对象,然而一个构造函数是允许返回一个对象值得,并且,如果这么做了,返回的对象成为new表达式的值,在此情况下,作为this的值得对象将被丢弃掉
一个对象的原型就是他的构造函数的prototype属性的值,所有函数都有一个prototype属性,当这个函数被定义的时候prototype就自动创建和初始化了,初始化值为一个对象,这个对象之带有一个属性名为constructor,它指回到和原型相关联的那个构造函数,添加给这个原型对象的任何属性,都会成为被构造函数所初始化的对象的属性,原型对象是放置方法和其它不变属性的理想地方
使用原型对象可以显著的减少每个对象所需内存的数量,因为对象可以继承原型的很多属性,即便是在对象创建后才添加到原型中的属性,对象也可以继承它,继承的属性就好像对象的常规属性一样发挥作用,可以使用for/in来枚举它们,并且可以在in运算符中测试他们,只能用Object.hasOwnProperty()来区分继承的属性和常规属性
在向对象写入一个值得时候,js不会使用原型对象,这样可以避免影响到其他同类型对象
如果原型中存在f,o.f = xx;那么将覆盖该对象原型中的f
扩展内建类型最安全而有用的,就是当一个旧的或不兼容的js缺少某个标准方法的时候,为原型添加这个标准方法
js中必须显示表示实例属性,如:
return this.width * this.height;
或
with (this)
return width * height;
类属性Rectangle.UNIT = new Rectangle(1, 1); 由于js函数是对象,可以像创建任何其他对象的属性那样来创建一个函数的属性
<闭包私有成员的实现>
在定义一个类时,应该为它定义一个toString()方法,以便这个类的实例能转换成有意思的字符串,另外还应该为类添加一个parses()方法,用来把toString()方法的字符串输出解析回对象模式,valueOf()方法有可能也需要,在定义valueOf()的时候要注意,某些条件下把一个对象转换成一个字符串的时候valueOf()可能比toString()方法更加优先使用
js用等于运算按地址来比较对象,而不是值,也就是说,给定两个对象引用,它会去检查看两个对象是否都是引用的同一个对象,而不是去检查是否两个不同的对象具有相同的属性名和值
如果想要A继承B那么要确保A的prototype是B的实例,这样他就继承了B的所有属性,(是否都成为了原形?)从子类的构造函数调用超类的构造函数是一个问题,当真么做的时候要注意,超类的构造函数是作为新创建的对象的一个方法调用,接下来,设置子类构造函数的原型需要一些技巧,必须显示把这个原型对象创建为超类的一个实例,然后显示的设置原型对象的constructor属性,另外,可能还想删除超类构造函数在原型对象中所有属性
子类的构造函数需要显示的调用超类的构造函数,叫做构造函数链,在创建子类的时候很常见,如果只有一层子类,可以为子类的原型对象添加一个名为superclass的属性,从而简化了构造函数链的语法:A.prototype.superclass = B或用
function A(...)
{
this.superclass(...);
this.x = ...;
...
}
超类构造函数通过this对象被显示调用,意味着不再需要使用call或apply()来吧构造函数作为改对象的方法来调用,但是这些只能在简单继承中使用,并不适合多层继承,多层还是需要使用构造函数链
当子类定义了一个和超类方法相同名字的方法时,子类的方法会覆盖超类的方法
调用父类的同名方法:
A.prototype.toString() = function()
{
return a.x + this.superclass.prototype.toString.apply(this);
}
superclass只能在继承层次中用一次,如果子类和类都使用该方法,那么将导致无限递归
浙公网安备 33010602011771号