原型与原型链详解

2022-12-27 0 617

序言

与绝大部分程序词汇词汇相同,ES6以后并没导入类(class)的基本概念,JavaScript绝非透过类而要间接透过缺省来建立示例。在如是说蓝本和蓝本链以后,他们有必要性先备考呵呵缺省的科学知识。

一、缺省

缺省商业模式的目地是为的是建立两个自订类,因此建立那个类的示例。缺省商业模式中保有了类和示例的基本概念,因此示例和示例间是互相分立的,即示例辨识。

缺省是两个一般的表达式,建立形式和一般表达式没差别,相同的是缺省生活习惯上第两个字母小写。除此之外是初始化形式的相同,一般表达式是间接初始化,而缺省须要采用newURL来初始化。

function Person(name, age, gender) { this.name = name this.age = age this.gender = gender this.sayName = function () { alert(this.name); } } var per = new Person(“孙悟空”, 18, “男”); function Dog(name, age, gender) { this.name = name this.age = age this.gender = gender } var dog = new Dog(“旺财”, 4, “雄”) console.log(per);//当他们间接在页面中打印两个对象时,事件上是输出的对象的toString()方法的返回值 console.log(dog);
原型与原型链详解

每建立两个Person缺省,在Person缺省中,为每两个对象都添加了两个sayName方法,也是说缺省每执行一次就会建立两个新的sayName方法。这样就导致了缺省执行一次就会建立两个新的方法,执行10000次就会建立10000个新的方法,而10000个方法都是一摸一样的,为什么不把那个方法单独放到两个地方,并让所有的示例都可以访问到呢?这就须要蓝本(prototype)

二、蓝本

在JavaScript中,每当定义两个表达式数据类型(一般表达式、类)时候,都会天生自带两个prototype属性,那个属性指向表达式的蓝本对象,因此那个属性是两个对象数据类型的值。

让他们用一张图表示缺省和示例蓝本间的关系:

原型与原型链详解

蓝本对象就相当于两个公共的区域,所有同两个类的示例都可以访问到那个蓝本对象,他们可以将对象中共有的内容,统一设置到蓝本对象中。

三、蓝本链

1.__proto__和constructor

每两个对象数据类型(一般的对象、示例、prototype……)也天生自带两个属性__proto__,属性值是当前示例所属类的蓝本(prototype)。蓝本对象中有两个属性constructor, 它指向表达式对象。

function Person() {} var person = new Person() console.log(person.__proto__ === Person.prototype)//true console.log(Person.prototype.constructor===Person)//true //顺便学习两个ES5的方法,可以获得对象的蓝本 console.log(Object.getPrototypeOf(person) === Person.prototype) // true
原型与原型链详解

2.何为蓝本链

在JavaScript中万物都是对象,对象和对象间也有关系,并不是孤立存在的。对象间的继承关系,在JavaScript中是透过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了两个蓝本指向的链条,专业术语称之为蓝本链。

举例说明:person → Person → Object ,一般人继承人类,人类继承对象类

当他们访问对象的两个属性或方法时,它会先在对象自身中寻找,如果有则间接采用,如果没则会去蓝本对象中寻找,如果找到则间接采用。如果没则去蓝本的蓝本中寻找,直到找到Object对象的蓝本,Object对象的蓝本没蓝本,如果在Object蓝本中依然没找到,则返回undefined。

他们可以采用对象的hasOwnProperty()来检查对象自身中是否含有该属性;采用in检查对象中是否含有某个属性时,如果对象中没但是蓝本中有,也会返回true

function Person() {} Person.prototype.a = 123; Person.prototype.sayHello = function () { alert(“hello”); }; var person = new Person() console.log(person.a)//123 console.log(person.hasOwnProperty(a));//false console.log(ain person)//true

person示例中没a那个属性,从 person 对象中找不到 a 属性就会从 person 的蓝本也是 person.__proto__ ,也是 Person.prototype中查找,很幸运地得到a的值为123。那假如 person.__proto__中也没该属性,又该如何查找?

当读取示例的属性时,如果找不到,就会查找与对象关联的蓝本中的属性,如果还查不到,就去找蓝本的蓝本,一直找到最顶层Object为止。Object是JS中所有对象数据类型的基类(最顶层的类)在Object.prototype上没__proto__那个属性。

console.log(Object.prototype.__proto__ === null) // true
原型与原型链详解

作者:浪里行舟

链接:蓝本与蓝本链简述 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

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

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