美文网首页
原型原型链与js对象的内存地址的理解

原型原型链与js对象的内存地址的理解

作者: zx一个胖子 | 来源:发表于2018-07-17 19:22 被阅读0次

一. js对象的内存地址的解析

 var o = new Object(),
    o1 = Object();
    console.log(o == o1);//false
    console.log(o === o1);//false

    var f = new Function(),
    f1 = Function();
    console.log(f == f1);//false
    console.log(f === f1);//false

    
    var a = new Array(),
    a1 = Array();
    console.log(a == a1);//false
    console.log(a === a1);//false

    var n = new Number(),
    n1 = Number();
    console.log(n == n1);//true
    console.log(n === n1);//false

    var s = new String(),
    s1 = String();
    console.log(s == s1);//true
    console.log(s === s1);//false

    var b = new Boolean(),
    b1 = Boolean();
    console.log(b == b1);//true
    console.log(b === b1);//false


    //数据类型null/undefined是没有构造函数的

注:上面的例子中Object/Function/Array的对比结果都好说,因为他们构建出来的都是新的对象,对象比较是要比较根源(数据是否是同一个)。无论是使用new还是直接调用生成一个新的对象是要开辟新的空间存储的,不会和任何一个对象相等。

js中对象的比较:只有地址相同才相等。 其中地址指的是内存地址,即:在电脑内存中存放的位置。
如:
···
var a = new Object();
var b = new Object();
a.name = "mm";
b.name = "mm";
var c = a;
var d = a;
···
1、a == b //false
2、a == c //true
3、a == d //true
4、b == c //false
5、b == d //false
其中a == b 为false 就是因为其内存地址不同,通俗点理解就是两个东西在堆内存的位置不同。
对于 var a = 1; 其实是建立了一个对象a,但是js并不能直接引用它的值,而其实是在引用对象a所对应的堆的地址。可以理解为:保存在变量对象中的一个地址,该地址与堆内存的实际值相关联。
例:

var a = 20;
var b = a;
b = 30;
599584-959cc758fb313a03.png
var m = { a: 10, b: 20 }
var n = m;
n.a = 15;
599584-c269c4c5cae7d537.png
QQ图片20180926174701.png

详细关于JS内存空间的描述请移步:https://blog.csdn.net/pingfan592/article/details/55189622/

二. 原型 原型链
懂了上面关于内存地址的介绍,将更加有利于理解原型与原型链

7ed42f5cly1fqguw4y1zej20ge0e8wes.jpg
首先要理解这张图。
看下面的图理解上面的图
QQ图片20180718130529.png
function person(){}是一个构造函数,在它的原型对象上添加一个name对象,person,prototype(指向原型对象),person,prototype.constructor(指向构造函数),person1(指向person实例),person1.proto(指向原型对象 person1.proto == person.prototype //true)。
每个实例对象(object )都有一个私有属性(称之为 proto)指向它的原型对象(prototype)。该原型对象也有一个自己的原型对象 ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
几乎所有 JavaScript 中的对象都是位于原型链顶端的object的实例。

三. 使用
使用原型对象的好处是让所有对象实例共享他的属性和方法。
例:

function Fish() {
}
Fish.prototype.name = "大白鲨";
Fish.prototype.color = '白色';
Fish.prototype.food = '大白鲨吃其它鱼';
Fish.prototype.eat = function () {
alert(this.food);
};
var shark1 = new Fish();
var shark2 = new Fish();
//    shark1.eat();
console.log(shark1.name);
console.log(shark2.name);
这里需要注意一点,shark1.name == shark2.name//true          shark1 == shark2 //false   不懂的看第一段。

参考 《高级程序设计》
问题:1、什么是原型链: ECMAScript中 原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。基本的实现是利用构造函数,原型和实例的关系。即是每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针[[prototype]].由于构造函数,原型和实例存在这样的关系,如果我们让一个原型对象等于另一个构造函数的实例,那么此时这个原型对象将包含一个指向另一个原型对象的指针,这样的话,另一个原型原型中也包含着指向另一个构造函数的指针。如果另一个原型又是另一个类型的实例,那么上面的关系还是会成立。这样层层递进,就够成了实例与原型的链条,这就是所谓的原型链的基本概念。

相关文章

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • JS原型链

    1什么是JS原型链? 通过__proto__属性将对象与原型对象进行连接. 1.1 JS原型链的作用? 组成的一个...

  • 原型原型链与js对象的内存地址的理解

    一. js对象的内存地址的解析 注:上面的例子中Object/Function/Array的对比结果都好说,因为他...

  • js_继承及原型链等(四)

    js_继承及原型链等(三) 1. 继承 依赖于原型链来完成的继承 发生在对象与对象之间 原型链,如下: ==原型链...

  • JavaScript原型链—prototype chain

    原型链是JS里一个重要的概念,理解原型链之前,我们要了解原型。 原型 mdn:每个对象都有一个内部链接到另一个对象...

  • js原型链--js面向对象编程

    简单粗暴地理解js原型链--js面向对象编程 原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢...

  • 2022前端高频面试题

    JS相关 1.原型和原型链是什么 原型和原型链都是来源于对象而服务于对象的概念js中引用类型都是对象,对象就是属性...

  • JavaScript 学习

    JS 原型与原型链 每个对象都有 __proto__属性,但只有函数对象才有 prototype 属性 所有对象的...

  • JavaScript 原型、原型链与原型继承

    原型,原型链与原型继承 用自己的方式理解原型,原型链和原型继承 javascript——原型与原型链 JavaSc...

  • JS原型理解

    原型链是整个JS面向对象的基础在理解原型链之前先来谈谈JS创建对象的几种方式 可以看到输出了4个对象,a1和a2看...

网友评论

      本文标题:原型原型链与js对象的内存地址的理解

      本文链接:https://www.haomeiwen.com/subject/nvsgpftx.html