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

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

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

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

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

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

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

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

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

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

相关·内容

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.7K20

聊聊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.4K30
  • 【设计模式】学习JS设计模式?先掌握面向对象!

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

    45040

    原型链分析

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

    25000

    深入理解 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中。

    25820

    JS中Class类的详解

    大家好,又见面了,我是你们的朋友全栈君。 概述     在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 = "苹果"

    73320

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

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

    51620

    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

    46420

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

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

    68270

    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 ?

    21320

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

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

    49720

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

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

    51640

    字节跳动最爱考的前端面试题: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继承背后的场景-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

    64910

    浅析CTF中的Node.js原型链污染

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

    2.3K70

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

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

    1K40

    构造函数和原型

    1.概述: 在典型的OOP的语言中(如Java) , 都存在类的概念,类就是对象的模板,对象就是类的实例,但在ES6之前, JS中并没用引入类的概念。...我 们可以把对象中一些公共的属性和方法抽取出来 ,然后封装到这个函数里面。 new在执行时会做四件事情: ①在内存中创建一个新的空对象。 ②让this指向这个新的对象。...静态成员:在构造函数本上添加的成员称为静态成员,只能由构造函数本身来访问 实例成员:在构造函数内部创建的对象成员称为实例成员,只能由实例化的对象来访问 2.1实例成员 实例成员就是构造函数内部通过...//console.log(ldh.sex); //不能通过对象来访问 3.构造函数的问题 构造函数方法很好用,但是存在浪费内存的问题。...; 注意:如果访问的对象本身有这个属性,这个对象的原型也有此属性时,实行就近原则,得到的是对象本身的这个属性值 1、当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性。

    48450
    领券