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

说说JS中的原型对象和原型链

理解原型对象(有些文章简称为原型)和原型链,是理解JS的重要一环。下面是笔者对JS中原型的理解, 函数对象 俗话说,JS中万物皆对象。函数也是一个对象,只不过函数是在特定环境中执行代码的对象。...JS中还包括一些系统内置的函数对象,比如: Function Object Array String Number RegExp 函数对象之外的对象都是普通对象。...变量xiaoming和xiaohong是构造函数Person的实例。...目前ECMAScript的标准中并没有实现标准的访问该指针的方式,但像Firefox、Chrome和Safari等浏览器实现了__proto__属性,此属性就是用来访问指针[[Prototype]],所以可以借用...每当访问一个对象的属性或者方法时,会首先搜索对象自身,如果找到了此属性或者方法,则直接返回,否则向对应的原型对象上面搜索,如果找到则直接返回,否则继续向原型对象的原型对象上查找,直到搜索到null,抛出错误或返回

9210

深度剖析前端JavaScript中的原型(JS的对象原型)

原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。...注意:必须重申,原型链中的方法和属性没有被复制到其他对象——它们被访问需要通过前面所说的“原型链”的方式。...注意:没有官方的方法用于直接访问一个对象的原型对象——原型链中的“连接”被定义在一个内部属性中,在 JavaScript 语言标准中用 [[prototype]] 表示(参见 ECMAScript)。...JavaScript 中到处都是通过原型链继承的例子。比如,你可以尝试从 String、Date、Number 和 Array 全局对象的原型中寻找方法和属性。...你可能会认为,this 关键字指向当前对象的原型对象,其实不是(还记得么?原型对象是一个内部对象,应当使用 __proto__ 访问)。

1.1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JS中的面向对象、原型、原型链、继承总结大全

    补充: js中说一切都是对象,是不完全的,在js中6种数据类型(Undefined,Null,Number,Boolean,String,Object)中,前五种是基本数据类型,是原始值类型,这些值是在底层实现的...Person.prototype.constructor = Person; 原型模式就是不必在构造函数中定义实例的属性和方法,而是将属性和方法都添加到原型对象中。...、Firefox、Safari等浏览器中在每个对象身上支持一个__proto__属性,指向的就是构造函数的原型对象。...都指向了Person.prototype中的showName 这种构造函数模式和原型模式组合使用,基本上可以说是js中面向对象开发的一种默认模式,介绍了以上这几种常用创建对象的方式, 还有其他不常用的模式就不介绍了...属性查找机制 js中实例属性的查找,是按照原型链进行查找,先找实例本身有没有这个属性,如果没有就去查找查找实例的原型对象,也就是[[prototype]]属性指向的原型对象,一直查到Object.prototype

    1.4K22

    深入理解javascript中的原型原型的概念使用原型给对象添加方法和属性使用原型对象的属性和方法原型的陷阱小结

    其实很好理解,javascript中对象是通过引用传递的,原型对象只有一份,不是new出一个对象就复制一份,所以我们对原型的操作和更新,会影响到所有的对象。这就是原型对象的实时性。 ?...Paste_Image.png 通过测试我们发现,我们没法访问刚刚更新的原型对象,却能访问之前的原型对象,这说明没有实现实时性。 我们继续测试 ?...这就是javascript中的原型陷阱。 我们很容易解决这个问题,只要在更新原型对象后面,重新指定构造函数即可。 Dog.prototype.constructor = Dog; ?...Paste_Image.png 这样所有就按正常的运行了 ** 所以我们切记在替换掉原型对象之后,切记重新设置constructor.prototype ** 小结 我们大概介绍了原型中容易混淆的问题,...对象的自身属性搜索的优先级比原型的属性要高 proto属性的神秘连接及其同prototype的区别 prototype使用中的陷阱

    4.3K30

    Java多线程——对象及变量的并发访问

    如上图所示,线程1修改X变量,是在自己工作内存中进行修改的,并未及时刷新到主内存中,如果这时候线程2去读取主内存中的数据X读取到的还是0,但实际上X已经被修改成1了,这就是线程可见性有可能出现的问题。...“非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是取到的数据其实是被更改过的。...a num=100 b set over b num=200 实验结论:在两个线程访问同一个对象中的同步方法时一定是线程安全的。...前提是多个线程访问的是同一个对象。但如果多个线程访问多个对象,则JVM便会创建多个锁,上面的示例就是创建了两个锁。...加上volatile关键字后,线程2修改变量后会强制将stop的值刷新到主内存中,线程1也会强制去主内存中读取数据,这样就不会出现可见性问题了。

    2K20

    JavaScript——对象的原型

    如机制和原理(对象基于原型)里所记述的那样,JavaScript是一个基于原型的面向对象的语言。本文着重于对原型的实现机制进行剖析和说明。...原型链的实现 JavaScript里所有的对象都有一个名为__proto__的属性,这个属性里面存放的就是对象所参照的原型对象的引用。 ?...__proto__中的对象连在一起就构成了一个原型链,链的顶端就是Object.prototype对象,Object.prototype的__proto__属性值则是null __proto__属性被包含在...__proto__ = Person.prototype; tom = Person.call(tom,"Tom"); 属性的继承 当访问对象的属性时,JavaScript会通过遍历原型链进行查找,直到找到给定名称的属性为止...而设值对象属性则不会遍历原型链,而是直接将属性添加到该对象自身,并不影响到原型链中的对象。

    59210

    js对象和原型、原型链的关系

    如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。我们称这个新对象为构造函数的实例。...判断方式有两种,但都是根据构造函数的prototype是否在原型链上来判断的:instanceof: 用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置语法:object instanceof...属性查找:如果试图访问对象(实例instance)的某个属性,会首先在对象内部寻找该属性,直至找不到,然后才在该对象的原型(instance.prototype)里去找这个属性,以此类推参考视频讲解:进入学习我们用一个例子来形象说明一下...// true String对象的原型是Object对象当你访问test的某个属性时,浏览器会进行以下查找:浏览器首先查找test 本身接着查找它的原型对象:String.prototype最后查找String.prototype...它们只能通过foo.obkoro1和foo.koro来访问。原型对象改变,原型链下游获取的值也会改变上面那个例子中的foo1.test的值是什么?

    1.5K20

    原型链中的函数和对象

    这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情 __ proto__ 最近在看高程4,原型链肯定是绕不过的,本瓜之前一直认为,只要记住这句话就可以了: 一个对象的隐式原型(__...proto__)等于构造这个对象的构造函数的显式原型(prototype) 确实,所有对象都符合这句真理,在控制台打印一试便知: const str = new String("123") str....__proto__ === Function.prototype 所以,不管你怎样通 __proto__ 隐式原型向上找,最终都只能找到 Function,而 Function 的隐式原型等于它的显式原型...__proto__ === Object.prototype // true Function 这个终极构造函数,通过查找显式原型的隐式原型,竟然等于 Object 的显式原型!...__proto__=== Object.prototype // true 所有构造函数的显式原型的隐式原型 等于 Object 的显式原型!! ---- 理解 为什么要这样设定呢??

    40010

    python 中变量和对象

    在 python 中,类型属于对象,变量是没有类型的: a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a...可更改(mutable)与不可更改(immutable)对象 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。...在 python 中,类型属于对象,变量是没有类型的。...a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是...当你创建一个对象并给它赋一个变量的时候,这个变量仅仅引用那个对象,而不是表示那个对象本身!也就是说,变量名只是指向计算机中存储那个对象的内存。这被称作名称到对象的绑定。 #!

    96810

    Vuex中的state访问状态对象

    state ,这个就是我们说的访问状态对象,它就是我们SPA(单页应用程序)中的共享值。 如何把状态对象赋值给内部对象,也就是把stroe.js中的值,赋值给我们模板里data中的值。...一、通过computed的计算属性直接赋值 computed属性可以在输出前,对data中的值进行改变,我们就利用这种特性把store.js中的state值赋值给我们模板中的data值。...$store.state.count这一句,一定要写this,要不你会找不到$store的。 这种写法很好理解,但是写起来是比较麻烦的,那我们来看看第二种写法。...二、通过mapState的对象来赋值 1.首先要用import引入mapState ``` import {mapState} from 'vuex' ``` 2.还在computed计算属性里写如下代码...uni-app中这么用: 1.import ``` import { mapState } from 'vuex'; ``` 2. ``` computed: {

    3.2K20

    多线程编程学习二(对象及变量的并发访问).

    一、概念 非线程安全:会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是"脏读",也就是取到的数据其实是被更改过的....2、当两个并发线程访问同一个对象Object 中的synchronized(this)同步代码块时,一段时间只能有一个线程被执行,另一个线程必须等待当前线程执行完这个代码块后才执行该代码块。 ?...在多线程环境中,use和assign 是多次出现的,但这一操作并不是原子性,也就是说在read和load之后,如果主内存count变量发生修改之后,线程工作内存中的值由于已经加载,不会产生对应的变化,也就是私有内存和公有内存的变量不同步...对于用volatile修饰的变量,JVM虚拟机只是保证从主内存加载到线程工作内存的值是最新的,例如线程 1 和线程 2 在进行read 和load 的操作中,发现主内存中count的值都是5,name就会加载这个最新的值...,也就是说,volatile关键字解决的是变量读时的可见性问题,但无法保证原子性,对于多个线程访问同一个实例变量还是需要加锁同步。

    1.1K140

    【说站】Javascript中对象原型 __proto__的介绍

    Javascript中对象原型 __proto__的介绍 说明 1、所有对象都会有一个属性__proto__指向构造函数的prototype原型对象....之所以我们可以使用构造函数prototype原型对象的属性和方法,是因为对象有__proto__原型。 2、__proto__对象原型的意义在于为对象的搜索机制提供一个方向或一条路线....但它是一个非标准属性,所以在实际开发中不能使用这个属性,它只是指原型对象prototype。... __proto__ 指向我们构造函数的原型对象 prototype         console.log(ldh..../ 如果么有sing 这个方法,因为有__proto__ 的存在,就去构造函数原型对象prototype身上去查找sing这个方法      以上就是Javascript中对象原型 _

    48710

    Java中引用变量与对象

    参考链接: Java中的变量范围 Java中的引用变量相当于C语言中的指针,它的作用是指向某个对象.比如 Child t;(引用变量的申明并创建了一个引用空间) t=new Child();(创建了一个...Child对象,并 把这个对象在堆内存中的地址赋给t) t 是 一个引用变量,指向了一个Child类型的对象.内存中,你首先声明了一个Child类型的引用变量,然后你创建了一个Child对象,并 把这个对象在堆内存中的地址赋给...由于Java中无法直接使用具体的对象,因此都是通过对象的引用来操作对象的.有的书上,把引用变量也称为对象句柄.好比你要用勺喝汤,而引用变量或对象句柄就是勺的把手,通过它来实现属于勺这个对象的喝汤的方法....前半句的意思是引用变量是指向对象的 后半句的意思是引用变量保存了对象在堆内存中的存储地址,引用变量也被称为对象句柄  变量的作用域  就是你定义的变量可以使用的代码范围 全局变量:在类里定义(非方法里)...局部变量:在方法中定义的变量,这个变量一旦出了这个方法,就不能用了  其他: 还有static变量 这个可以用类名直接来用 普通的类变量要用类对象来调用 final变量就是赋值后不能改变的

    1.4K10

    【Python】面向对象 - 封装 ② ( 访问私有成员 | 对象无法访问私有变量 方法 | 类内部访问私有成员 )

    一、访问私有成员 1、对象无法访问私有变量 在下面的 Python 类 Student 中 , 定义了私有的成员变量 , # 定义私有成员 __address = None 该私有成员变量..., 只能在类内部进行访问 , 类的外部无法进行访问 ; 在 类外部 创建的 Student 实例对象 , 是无法访问 __address 私有成员的 ; 使用 实例对象 访问 类的私有成员 , 编译时不会报错...__address) 访问 s1 实例对象 的 __address 成员 , 会报如下错误 ; 代码示例 : """ 面向对象 - 封装 """ # 定义 Python 类 class Student...Tom 18 Process finished with exit code 1 2、对象无法访问私有方法 在类中 定义私有成员方法 # 定义私有成员方法 def __say(self...在 Student 类中 , 定义了 私有成员变量 和 私有成员方法 : # 定义私有成员 __address = None # 定义私有成员方法 def __say

    28320

    ES5中的对象冒充继承与原型继承

    '); }; // 定义一个新的方法 function Web() { // 对象冒充继承 Person.call(this, 'Augus', 18); }; // 对象冒充可以继承构造函数里面的属性和方法...(); console.log(web.name); // Augus console.log(web.age); // 18 web.say(); // My name is Augus // 对象冒充没法继承原型链上的属性和方法...ES5里原型链的继承,既可以实现构造函数的继承又可以实现原型链的继承 function Person() { this.name = 'Augus'; this.age = 20;...ES5中,原型链继承存在的问题,实例化子类没法给父类传值 function Person(name, age) { this.name = name; this.age = age...原型链+构造函数的组合继承模式的另一种写法 function Person(name, age) { this.name = name; this.age = age; this.say

    47220

    JS中的原型和原型链

    原型链 每一个对象都可以有一个原型,这可原型还可以有它自己的原型,以此类推,就形成了原型链。...查找一个对象的属性或方法的时候,如果这个对象中没有这个属性或者方法,那就会在这个对象的原型对象中去找,以此类推,直到原型链结束。..._proto_ _proto_是原型链查询中实际用到的,指向构造函数的原型对象,他是对象独有的。对象._proto_ = 构造函数.prototype。 在js中,万物皆是对象,函数也是对象。...3、构造函数的prototype指向原型对象,原型对象的constructor指向构造函数。 使用 prototype最主要的用法就是将属性暴露成公用的。...wang.name); //wang console.log(li.name); //li console.log(wang.f === li.f); //false 虽然wang和li都有f属性,但是实例对象访问的都是自己的私有属性

    1.5K10

    对象、消息、运行期--7:在对象内部尽量直接访问实例变量

    在fullName的获取方法和设置方法中,使用点语来访问相关属性 #import @interface Person : NSObject @property...fullName{ return [NSString stringWithFormat:@"%@-%@",self.firstName,self.lastName]; } @end 在fullName的获取方法和设置方法中...fullName{ return [NSString stringWithFormat:@"%@-%@",_firstName,_lastName]; } @end 这俩种写法区别: 直接访问属性的速度比较快...这种情况下,编译器所生成的代码会直接访问保存属性的那块内存 直接访问属性时,不会调用其setter方法 直接访问属性,不会触发KVO通知 通过属性来访问有助于排查与之相关的错误 读取属性的时候采用直接访问的形式...设置属性的时候通过属性处理 参考 Effective+Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法

    15910
    领券