js中,什么是原型、原型链?

2023-08-23 0 324

程序词汇都有标识符F83E43Se的监督机制,类似于Java, C#此种程序词汇词汇选用了承继的形式,换言之class是object的模版, 常量承继派生类, 透过常量建立的object也就有了派生类的各式各样特性和方式

JS采用了蓝本链的形式,要认知蓝本链,具体来说要是舍弃class的观念形式(尽管ES6国际标准导入了classURL,但class而已function的句法糖罢了,前述下层却是function;)

采用JavaScript的newURLcodelet

function Person(name, age) { this.name = name; this.age = age; this.sayHi = function() { console.log(`hi from ${name}`) } } const me = new Person(“rz”, 24); console.log(me.age); me.sayHi()

这里的Person函数的作用很简单,构建对象,甚么样的对象呢?这个对象有个name和age特性,有个sayHi的方式,仅此罢了。但JS中函数本身也是个对象,也就是说Person自己是个对象。是对象就可以设定特性:

Person.purpose = “我的目的是构造一个对象,这个对象有name和age特性,还有一个sayHi的方式”; console.log(Person.purpose)

这里给Person这个对象加了个purpose特性, 类型是string. 但这个特性只属于Person, 和Person构建的对象毫无关系

console.log(me.purpose); //undefined

那我们怎么给me加一个purpose的特性呢?当然我们可以在me被建立后手动添加:

me.purpose = “Make the world a better place”;

但子曰,人之初性本善,所以每个人的purpose都应该是”Make the world a better place”. 也就是说,最好是me被建立时就有purpose特性, 而且它的值是”Make the world a better place”, 最直接的做法是修改Person函数:

function Person(name, age) { this.purpose = “Make the world a better place”; this.name = name; this.age = age; this.sayHi = function() { console.log(`hi from ${name}`) } }

此种当然没有问题,但有些时候Person函数是别人的标识符,直接改动别人的实现形式不大好,我们能不能透过扩展的形式实现呢?

Person.prototype.purpose = “Make the world a better place”; const me = new Person(rz, 24); const you = new Person(jack, 25); console.log(me.purpose, “|”, you.purpose);

这里在求值me.purpose的过程中,JS发现me自己没有purpose这个特性, 它会去me的构造函数Person的prototype里面找(对,就是这么绕), 看有没有purpose特性,也就是Person.prototype有没有purpose这个特性。发现有, JS返回”Make the world a better place”;

那如果是没有找到呢?

console.log(me.address);//undefined

JS发现me没有address特性,就去Person.prototype里面找, 发现也没有, 继续往上找, 最上层一定是Object.prototype, 发现也没有, JS舍弃,返回undefined

一些补充:

当我们采用字面值codelet的时候,其实是隐式采用了new关键词:
const obj = { name: “patrick” }; //以上这行标识符前述等价于: //const obj = new Object(); //obj.name = “patrick”

2. 其实在采用Array的时候,我们就已经在采用蓝本链了:

const numbers = [3, 1, 2 ]; console.log(numbers.sort()); // [1, 2, 3]

数组也是对象, 为甚么我们没有定义sort方式, 当我们尝试执行这个方式的时候没有报错? 原因就是蓝本链, 数组的构造函数是Array这个JS内置对象, Array.prototype.sort是存在的,我们就可以采用这个方式

3. 由于函数可以用来codelet,而且函数本身也是对象,这也是为甚么人们常说“在JS里函数是一等公民”的原因。何止是一等公民,简直是国之重器

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务