摘要:注意,此处的构造函数指的是使用方式的构造函数。也就是说,你可以在支持该实现的浏览器下,,,去访问对象的构造函数的原型对象。另外一种判断实例对象和其原型对象存在指向关系由实例的指向其构造函数的原型对象的方法是。
这里,我们列出原型的几个概念,如下:
prototype属性
[[prototype]]
__proto__
prototype属性只要创建了一个函数,就会为该函数创建一个prototype属性,指向该函数的原型对象。实例对象是不会拥有该属性的。
默认情况下,该原型对象也会获得一个constructor属性,该属性包含一个指针,指向prototype属性所在的函数。
function Person() {}// 只是一个函数而已 Person.prototype.constructor === Person[[prototype]]和__proto__
javascript中,不可以访问的内部属性都是用[[propertyName]]这种形式来表示的,比如还有枚举属性[[Enumberable]]。
[[prototype]]属性只能是对象可以拥有的属性。比如实例化的对象以及原型对象,而不是构造函数。这个属性指向拥有其属性的对象的构造函数的原型对象。注意,此处的构造函数指的是使用new方式的构造函数。并不因为更改了原型对象上的constructor属性而改变。
比如:
function Person() {} Person.prototype.constructor = {}; // 此处修改了Person原型的构造函数指向 let p = new Person(); p.__proto__ === Person.prototype; // true
__proto__是个啥呢,就是对[[propertyName]]的实现。也就是说,你可以在支持该实现的浏览器下(FF,chrome,safari),去访问对象的构造函数的原型对象。比如:
var Person = function(name) { this.name = name; }; var p1 = new Person(); p1.__proto__=== Person.prototype; // true Person.prototype = {}; var p2 = new Person(); p2.__proto__ === Object.prototype; // false
当然,__proto__只是浏览器的私有实现,目前ECMAScript标准实现方法是Object.getPrototypeOf(object)。
var Person = function(name) { this.name = name; }; var p1 = new Person(); Object.getPrototypeOf(p1) === Person.prototype; // true Person.prototype = {}; var p2 = new Person(); Object.getPrototypeOf(p2) === Object.prototype; // false
另外一种判断实例对象和其原型对象存在指向关系(由实例的[[prototype]]指向其构造函数的原型对象)的方法是:isPrototypeOf。比如:
Person.prototype.isPrototypeOf(p1); // true
由于函数和原型对象也是一个对象,所以,它自然而然也拥有[[prototype]]属性。
弄清楚了这些概念,原型链,继承等存在的一些问题,都不是问题了。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/78159.html
摘要:首先,需要来理清一些基础的计算机编程概念编程哲学与设计模式计算机编程理念源自于对现实抽象的哲学思考,面向对象编程是其一种思维方式,与它并驾齐驱的是另外两种思路过程式和函数式编程。 JavaScript 中的原型机制一直以来都被众多开发者(包括本人)低估甚至忽视了,这是因为绝大多数人没有想要深刻理解这个机制的内涵,以及越来越多的开发者缺乏计算机编程相关的基础知识。对于这样的开发者来说 J...
摘要:我们已经回答了的构造函数和原型都是谁的问题,现在牵扯出来一个,我们继续检查的构造函数是全局对象上属性叫的对象的原型是个匿名函数,按照关于构造函数的约定,它应该是构造函数的属性我们给这个对象起个名字,叫。 我不确定JavaScript语言是否应该被称为Object-Oriented,因为Object Oriented是一组语言特性、编程模式、和设计与工程方法的笼统称谓,没有一个详尽和大家...
摘要:这正是我们想要的太棒了毫不意外的,这种继承的方式被称为构造函数继承,在中是一种关键的实现的继承方法,相信你已经很好的掌握了。 你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- 继承就和原型链这一概念息息相关。甚至可以说,所谓的原型链就是一条继承链。有些困惑了吗?接着看下去吧。 一、构造函数,原型属性与实例对象 要搞清楚如何在JavaScript中实现继承,...
摘要:是完全的面向对象语言,它们通过类的形式组织函数和变量,使之不能脱离对象存在。而在基于原型的面向对象方式中,对象则是依靠构造器利用原型构造出来的。 JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或者只是部分具备一些面向对象的特征。本文将回归面向对象本意,从对语言感悟的角度阐述为什...
摘要:原型之所以被称为原型,可能正是因为这种不可重载的特质。而一旦实例化,那么将指向实例化的对象。首先是,我使用了,直接利用猫咪的年龄进行计算得出体重返回给属性。 和java比起来,javascript真的是松散的无以复加,不过这也让我们在无聊之余,有精力去探讨一些复杂的应用,从而在开发之路上,获得一些新的想法。 javascript中的类的构造 javascript中有对象的概念,却没有类...
阅读 4885·2023-04-25 19:30
阅读 2095·2023-04-25 15:09
阅读 2586·2021-11-16 11:45
阅读 2135·2021-11-15 18:07
阅读 1434·2021-11-11 17:22
阅读 2085·2021-11-04 16:06
阅读 3535·2021-10-20 13:47
阅读 2984·2021-09-22 16:03