程序词汇都有标识符F83E43Se的监督机制,类似于Java, C#此种程序词汇词汇选用了承继的形式,换言之class是object的模版, 常量承继派生类, 透过常量建立的object也就有了派生类的各式各样特性和方式
JS采用了蓝本链的形式,要认知蓝本链,具体来说要是舍弃class的观念形式(尽管ES6国际标准导入了classURL,但class而已function的句法糖罢了,前述下层却是function;)
采用JavaScript的newURLcodelet
这里的Person函数的作用很简单,构建对象,甚么样的对象呢?这个对象有个name和age特性,有个sayHi的方式,仅此罢了。但JS中函数本身也是个对象,也就是说Person自己是个对象。是对象就可以设定特性:
这里给Person这个对象加了个purpose特性, 类型是string. 但这个特性只属于Person, 和Person构建的对象毫无关系
那我们怎么给me加一个purpose的特性呢?当然我们可以在me被建立后手动添加:
但子曰,人之初,性本善,所以每个人的purpose都应该是”Make the world a better place”. 也就是说,最好是me被建立时就有purpose特性, 而且它的值是”Make the world a better place”, 最直接的做法是修改Person函数:
此种当然没有问题,但有些时候Person函数是别人的标识符,直接改动别人的实现形式不大好,我们能不能透过扩展的形式实现呢?
这里在求值me.purpose的过程中,JS发现me自己没有purpose这个特性, 它会去me的构造函数Person的prototype里面找(对,就是这么绕), 看有没有purpose特性,也就是Person.prototype有没有purpose这个特性。发现有, JS返回”Make the world a better place”;
那如果是没有找到呢?
JS发现me没有address特性,就去Person.prototype里面找, 发现也没有, 继续往上找, 最上层一定是Object.prototype, 发现也没有, JS舍弃,返回undefined
一些补充:
当我们采用字面值codelet的时候,其实是隐式采用了new关键词:2. 其实在采用Array的时候,我们就已经在采用蓝本链了:
数组也是对象, 为甚么我们没有定义sort方式, 当我们尝试执行这个方式的时候没有报错? 原因就是蓝本链, 数组的构造函数是Array这个JS内置对象, Array.prototype.sort是存在的,我们就可以采用这个方式
3. 由于函数可以用来codelet,而且函数本身也是对象,这也是为甚么人们常说“在JS里函数是一等公民”的原因。何止是一等公民,简直是国之重器