首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我不能通过其原型访问类中“this”上的属性?

在JavaScript中,类的原型是一个对象,它包含类的方法和属性。当我们创建一个类的实例时,实例会继承类的原型上的方法和属性。

在类的方法中,我们可以通过关键字"this"来引用当前实例对象。"this"指向调用该方法的对象,即当前实例。然而,如果我们尝试通过类的原型访问类中的属性,"this"将不再指向当前实例,而是指向原型对象本身。

这是因为在JavaScript中,属性的查找是按照原型链进行的。当我们访问一个对象的属性时,JavaScript引擎会先查找对象本身是否有该属性,如果没有,它会沿着原型链向上查找,直到找到该属性或者到达原型链的顶端。

因此,当我们在类的原型中访问属性时,"this"指向的是原型对象,而不是当前实例。这意味着我们无法直接通过原型访问类中的实例属性。

解决这个问题的一种常见方法是将属性定义在构造函数中,而不是类的原型中。这样,每个实例都会有自己的属性副本,并且可以通过"this"来访问。

另外,如果我们希望在类的原型中访问类中的属性,可以使用箭头函数来定义方法。箭头函数没有自己的"this"绑定,它会继承外部作用域的"this"。因此,在箭头函数中,"this"指向的是定义该箭头函数的上下文,即当前实例。

总结起来,不能通过类的原型访问类中的属性是因为"this"在原型中指向原型对象本身,而不是当前实例。我们可以将属性定义在构造函数中或者使用箭头函数来解决这个问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

谈谈Python:为什么私有属性可以在外部赋值并访问

Python:为什么私有属性可以在外部赋值并访问?...问题引入 在慕课网上学习Python**私有属性**时候,看到了一个同学提问: 将count改为__count,为什么实例变量在外部仍然可以修改__count?这里print p1....__count赋值操作,其实是在p1定义了一个名为__count变量(因为Python都是动态变量),而没有改变真正属性。...所以我们在外部用“属性名”访问私有属性时候,会触发AttributeError,从而实现“私有属性特性。但通过“属性名”也可以访问这些属性。...以上这篇谈谈Python:为什么私有属性可以在外部赋值并访问就是小编分享给大家全部内容了,希望能给大家一个参考。

2.8K10

iOS开发访问并修改一个私有属性

https://blog.csdn.net/u010105969/article/details/70037605 在OC会有某些私有属性,这些属性通常写在.m文件或在.h文件中用@private...某些之所以有某些私有属性是因为不想这些属性被外界访问并修改。但我们仍能对私有属性进行访问和修改。访问以及修改私有属性有两种方式:KVC、runtime。...1.KVC 我们可以用setValue:方法设置私有属性,并利用valueForKey:方法访问私有属性。假设我们有一个Person,并且这个有一个私有属性name。...(@"=======%@", [ls valueForKey:@"name"]) 2.runtime 我们可以利用runtime获取某个所有属性(私有属性、非私有属性),在获取到某个属性后就可以对该属性进行访问以及修改了...之前有篇博客就是通过runtime获取某个所有成员变量名称然后对进行归档,博客地址:http://blog.csdn.net/u010105969/article/details/62233752

2.5K20

【设计模式】学习JS设计模式?先掌握面向对象!

在JavaScript中有一个很有意思__proto__属性用于访问原型对象,构造函数,实例,原型本身都有__proto__指向原型对象。...('在学习' + this.subject); } 为什么要将方法挂载到原型?...__proto__是指向原型对象,其中Student.prototype也是指向原型对象,结果为true就能很好说明方法全部是定义在原型。...实例与 javascript实例方法与方法区别 类属性(静态属性):通过直接访问,不需要声明实例来访问 方法(静态方法):通过直接访问,不需要声明实例来访问 实例属性(动态属性):...不能通过直接访问,需要通过该类声明实例才能访问 实例方法(动态方法):不能通过直接访问,需要通过该类声明实例才能访问 Person = function(){ } Persion.sex = "

42040

聊聊Spring数据绑定 --- 属性访问器PropertyAccessor和实现DirectFieldAccessor使用【享学Spring】

为了体现这个接口它重要性,据我目前了解此处贴出这么一句话: 所有Spring创建Bean对象都使用该接口存取Bean属性值 PropertyAccessor 它是可以访问命名属性named properties...(例如对象bean属性或对象字段)公共接口。...} 此访问器将集合和数组值转换为相应目标集合或数组,当然还解决了级联属性(嵌套属性问题~ 需要特别注意是:AbstractNestablePropertyAccessor这个抽象在Spring4.2...使用DirectFieldAccessor直接属性访问器给赋值: public static void main(String[] args) { Apple apple =...如果某个值要给赋值给bean属性,Spring都会把这个值包装成ProperyValue对象。 PropertyTokenHolder作用是什么? 这个作用是对属性访问表达式细化和归类。

2.2K20

原型链分析

如果你想搞清楚究竟是否需要用到元,那么你就不需要它。那些实际用到元的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元。”...哦,对于python来说元是需要用到时候一定是已经理解了,用不到时候说明是不理解,唔,愿称之为薛定谔の学习,但不影响我们互相印证学习。...虽然在脚本没有标准方式访问Prototype,但Firefox、Safari和Chrome在每个对象都支持一个属性__proto__。而在其他实现,这个属性对脚本则是完全不可见。...虽然可以通过对象实例访问保存在原型值,但却不能通过对象实例重写原型值。...在实例修改了原型引用类型属性,会在所有实例反映出来 [原型链污染.png] 这个其实也就会引出原型链污染问题,具体案例实践,不妨看这篇文章利用原型链漏洞污染拿下服务器权限

22800

深入理解 JavaScript Prototype 污染攻击

比如上图中foo对象,天生就具有foo.show()方法。 我们可以通过Foo.prototype来访问Foo原型,但Foo实例化出来对象,是不能通过prototype访问原型。...一个Foo实例化出来foo对象,可以通过foo.__proto__属性访问Foo原型,也就是说: foo....,指向这个对象所在prototype属性 0x02 JavaScript原型链继承 所有对象在实例化时候将会拥有prototype属性和方法,这个特性被用来实现JavaScript继承机制...__proto__.bar = 2,而foo是一个Object实例,所以实际是修改了Object这个,给这个增加了一个属性bar,值为2。...而这里lodash.merge操作实际就存在原型链污染漏洞。 在污染原型链后,我们相当于可以给Object对象插入任意属性,这个插入属性反应在最后lodash.template

19520

JSClass详解

大家好,又见面了,是你们朋友全栈君。 概述     在ES6,class ()作为对象模板被引入,可以通过 class 关键字定义。...它可以被看作一个语法糖,让对象原型写法更加清晰、更像面向对象编程语法。     实际是个“特殊函数”,就像你能够定义函数表达式和函数声明一样,语法有两个组成部分:表达式和声明。...默认返回实例对象 this this.y = y } toString() { console.log(this.x + ', ' + this.y) } } 注意: 在声明方法时候...,方法前不加 function 关键字 方法之间不要用逗号分隔,否则会报错 内部所有定义方法,都是不可枚举(non-enumerable) 一个只能拥有一个 constructor 方法 静态方法...    所有方法都定义在 prototype 属性上面,在实例上面调用方法,其实就是调用原型方法     原型方法可以通过实例对象调用,但不能通过名调用,会报错 class Person

4.4K10

如何使用 javascript 面向对象编程来唬住面试官(part 2)

但是比较懵逼,为什么这样就可以了呢?原型是个什么?怎么起作用呢?...为什么能够通过原型模式来解决问题呢?...javascript 解析器读取到对象之后,会执行一次搜索,如果在当前对象没有搜索到目标属性的话,就会继续搜索指针指向原型对象。 这里有2个图帮助理解: ?...,不能通过对象实例来重写原型值③ 对象实例可以重写从原型对象“继承”过来同名属性,这时候会切断对象实例和原型对象某个同名属性联系,如果想恢复联系即恢复没改过同名属性的话,可以使用delete...删除对象实例某个属性④ hasOwnProperty()方法可以检测一个属性是存在于实例还是存在于原型 function Food() {} Food.prototype.name = "苹果"

71120

【前端词典】必备知识-原型原型

原因无非有二: ECMAScript 继承实现方法区别于其他基于实现继承面向对象(Object Oriented)语言。...在讲 ECMAScript 继承概念之前,先说下原型概念。 原型 讲 ECMAScript 继承概念之前,先说下概念。...JavaScript 摒弃转而使用原型作为实现继承基础,是因为基于原型继承相比基于继承在概念更为简单。...听到有人在问为什么? 因为这个 __proto__.constructor 指向是 Object。 我们知道:一个函数原型对象构造函数是这个函数本身。...3. new 操作符 当我们使用 new 操作符时,生成实例对象拥有了 __proto__属性。即在 new 过程,新对象被添加了 __proto__ 并且链接到构造函数原型

49820

涨薪必备Javascript,快点放进小口袋!

这里又大致分为几种情况,分别为  1.1、对象方法调用 即某方法为某对象一个属性属性,正常情况当改方法被调用时候,this指向则是挂载该方法对象。...这也是为什么a.bind(b).call(c),最终this指向会是b原因。至于为什么,其实就是bind实现实际是通过闭包,并且配合call/apply进行实现。...一般情况,我们做原型链继承,会通过子类prototype属性等于(指向)父实例。...这里额外提一件我们经常干“高端”事情,那就是通过原型prototype做monkey patch。即想在继承父方法同时,完成自己独立一些操作。...这里简单提一下,首先这边牵扯到两个点,一个就是for循环同步任务,一个就是setTimeout异步任务,在JavaScript线程,因为本身JavaScript是单线程,这个特点决定了正常脚本执行顺序是按照文档流形式来进行

65970

Class降级

,注意:会同时存在原型和实例,而且不可枚举(控制台打印即灰色),不能被for-of、for-in等遍历到 return this.number * this.unitPrice;...ES6访问器不可枚举,同时会存在在原型和实例 4. ES6方法不可枚举,同时只能当作普通方法调用,不能通过new形式来调用 5....ES6继承是先将父实例对象属性和方法,添加到this(所以必须先调用super()方法),然后再调用字累构造函数修改this;ES5继承,实质是先创造子类实例对象this,然后再将父方法添加到..._proto__指向父构造函数,这里setPrototypeOf方法和create类似,可以看出class继承同时存在两条继承链:子类构造函数__proto__指向父,子类原型__proto_..._指向父原型 if (superClass) { Object.setPrototypeOf ?

18920

涨薪必备Javascript,快点放进小口袋!

这里又大致分为几种情况,分别为  1.1、对象方法调用 即某方法为某对象一个属性属性,正常情况当改方法被调用时候,this指向则是挂载该方法对象。...这也是为什么a.bind(b).call(c),最终this指向会是b原因。至于为什么,其实就是bind实现实际是通过闭包,并且配合call/apply进行实现。...一般情况,我们做原型链继承,会通过子类prototype属性等于(指向)父实例。...这里额外提一件我们经常干“高端”事情,那就是通过原型prototype做monkey patch。即想在继承父方法同时,完成自己独立一些操作。...这里简单提一下,首先这边牵扯到两个点,一个就是for循环同步任务,一个就是setTimeout异步任务,在JavaScript线程,因为本身JavaScript是单线程,这个特点决定了正常脚本执行顺序是按照文档流形式来进行

48320

ES6 系列之箭头函数

当通过 new 调用函数时,执行 [[Construct]] 方法,创建一个实例对象,然后再执行函数体,将 this 绑定到实例。 当直接调用时候,执行 [[Call]] 方法,直接执行函数体。...没有原型 由于不能使用 new 调用箭头函数,所以也没有构建原型需求,于是箭头函数也不存在 prototype 这个属性。...没有 super 连原型都没有,自然也不能通过 super 来访问原型属性,所以箭头函数也是没有 super ,不过跟 this、arguments、new.target 一样,这些值由外围最近一层非箭头函数决定...对象属性函数就被称之为 method,那么 non-mehtod 就是指不被用作对象属性函数了,可是为什么说箭头函数更适合 non-method 呢?...嘿嘿,如果你知道,可以告诉~ 作者:冴羽 https://github.com/mqyqingfeng/Blog/issues/84

44120

JavaScript继承背后场景-prototype,__proto__, ]

如上图所示,理解JavaScript继承关键是要理解母鸡如何产蛋过程。 [[prototype]]、__proto__、prototype三者之间联系 每个对象都可以有另一个对象作为原型。...然后前一个对象继承了它所有原型属性。对象通过内部属性[[Prototype]]指定原型。由[[Prototype]]属性连接对象链称为原型链。 ?...如果原型具有对原型非空引用,依此类推,则称为原型链。 以下是JavaScript经典继承图表。构造函数Foo只是虚构名。foo对象是Foo一个实例。 ?...Foo.prototype指向原型某些位置,但Foo这个原型属性不是来自原型链。构成原型是proto指向链,以及proto指向对象。...如果move方法不是这个对象一个属性(意味着Dog这个并没有move这个方法),则在原型链中上升一级(去原型寻找),即woofie .__ proto . proto__,或者与Animal.prototype

61710

知其然,知其所以然,JS 对象创建与继承

对象创建 不难发现,每一篇都离不开工厂、构造、原型这 3 种设计模式至少其一! 让人不禁想问:JS 为什么非要用到这种 3 种设计模式了呢??...构造+原型问题在于,我们不能通过查找原型链从 MakeCarChild 找到 MakeCar car4....__proto__ === MakeCar.prototype // false 无论在原型怎么找,都无法从 MakeCarChild 找到 MakeCar 这就意味着:子类不能继承父原型属性...为什么“子类要继承父原型属性”?就靠 this 绑定来找不行吗?...对应代码意思: 所有的构造函数隐式原型都等于 Function 显示原型,函数都是由 Function 构造而来,Object 构造函数也不例外; 所有构造函数显示原型隐式原型,都等于 Object

48740

字节跳动最爱考前端面试题:JavaScript 基础

而且,对象属性链只有一层或者说最后一层在调用位置起作用 function foo() { console.log(this.a); } var obj = { a: 2, foo: foo...[[Prototype]] 链最终都会指向内置 Object.prototype,包含了 JavaScript 许多通用功能 为什么能创建 “”,借助一种特殊属性:所有的函数默认都会拥有一个名为...,此实例包含一个指向原型对象指针,也就是通过 [[Prototype]] 链接到了这个原型对象 然后说一下 JS 属性查找:当我们试图引用实例对象某个属性时,是按照这样方式去查找,首先查找实例对象是否有这个属性...:这样逐级查找形似一个链条,且通过 [[Prototype]] 属性链接,所以被称为原型链 什么是原型链继承,类比继承:当有两个构造函数 A 和 B,将一个构造函数 A 原型对象,通过 [[...Static 关键字有了解嘛 为这个函数对象直接添加方法,而不是加在这个函数对象原型对象 (3)问:事件循环机制 (Event Loop) 事件循环机制从整体上告诉了我们 JavaScript

1.4K20

稳扎稳打JavaScript(三)——创建对象几种方式

原型特点 每个函数初始化完成后都会创建一个原型对象,即:函数对象和原型对象一一对应; 通过new创建所有对象,都有一个proto属性指向原型对象; 3.3. 原型能做什么?...缺点 也正是因为原型拥有被同一所有对象共享特点,因此如果将所有属性都定义在原型,那么就不存在对象实例属性了。 4....,对于安全级别较高属性,不能直接挂载到object对象(因为直接挂载到object属性可以被外界随意修改和访问),而是让它们以局部变量形式出现在构造函数,若外界要访问和修改,则在object...添加访问和修改函数,这样就可以在函数对修改作限制。...我们知道,函数局部变量存在于函数变量对象,一旦函数执行完成,变量对象值只能通过函数内部闭包来访问。 7.2. 对象创建方式 不能通过new创建,只能当作普通函数调用。

96240

浅析CTFNode.js原型链污染

当我们访问一个对象属性时,如果该对象没有这个属性,JavaScript引擎会在它原型对象查找这个属性。这个过程会一直持续,直到找到该属性或者到达原型末尾。...攻击者可以利用这个特性,通过修改一个对象原型链,来污染程序行为。例如,攻击者可以在一个对象原型设置一个恶意属性或方法,当程序在后续执行访问属性或方法时,就会执行攻击者恶意代码。...我们实例化出来person1对象,它是不能通过prototype访问原型,但通过__proto__就可以实现访问Person原型,具体代码如下 console.log(person1....,所有对象在实例化时候将会拥有prototype属性和方法 2、一个对象__proto__属性,指向这个对象所在prototype属性 他们关系图如下所示 具体过程 那么什么是原型链污染呢...__proto__也是Object.prototype,所以此时它调用number就是我们刚刚污染属性,所以这也就是为什么c .number=520 它常见于当存在函数(功能是将一个数组内容复制到另一个数组

1.8K60
领券