建立一个class (类)
function myclass1 () {
this.nickname = 'mike'
}
这样,我们就建立了一个 class 名字叫myclass1, 包含一个属性nickname, 值是 mike
有了类 我们就开始建立一个实例
var1 = new myclass1()
去console里面 输入 var1.nickname 会返回值 mike
现在,我们来建立一个新的类 来继承刚才的myclass1
function newclass() {
this.age = 18
}
newclass.prototype = new myclass1()
新的类 继承了 myclass1 , 拥有 nickname 属性, 同时也有新的属性 age
最后一句 相当奇怪 看上去是 将一个实例 赋值入 一个类的原型集
实际上 效果可以像下面这样描述 原文没有这样的写法 但我测试过是可以的
注意: 这种写法只能继承 经由 prototype 定义的属性,直接用对象描述的属性 不能继承, 慎用。
newclass.prototype = myclass1.prototype;
不管怎么样 newclass 的确继承了 myclass1, 我们可以来做个试验
myclass1.prototype.homepage = 'abc.com'
我们可以去console里面检查刚才建立的newclass实例 var1
我们发现多了个新属性 homepage
还记得刚才说的 只能适用于 prototype 建立的属性吗? 也就是说 你输入 myclass1.prototype.nickname='hello kitty'
原来的nickname 仍然是 mike
最后, 提醒一下 类和实例 是两回事 很容易混淆的
比如刚才的 myclass1 是个类
var1 是个实例
访问类的原型要通过 prototype, 如果你直接输入 myclass1.nickname 是会显示 未定义
然后,再你构造类的时候 this.xxx 跟 class.prototype.xxx 是不一样的
this.xxx 是对象 优先级比 prototype.xxx 要高 但可以共存
当你将类 实例化的时候 你去访问xxx的值 是只会显示 对象的值