详解prototype与__proto__区别

Each constructor is a function that has a property named “prototype” that is used to implement prototype-based inheritance and shared properties. Every object created by a constructor has an implicit reference (called the object’s prototype) to the value of its constructor’s “prototype” property.

When a constructor creates an object, that object implicitly references the constructor’s prototype property for the purpose of resolving property references. The constructor’s prototype property can be referenced by the program expression constructor.prototype, and properties added to an object’s prototype are shared, through inheritance, by all objects sharing the prototype. Alternatively, a new object may be created with an explicitly specified prototype by using the Object.create built-in function. –ECMAScript? 2015 Language Specification

__proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!!

使用Object.getPrototypeOf()代替__proto__!!!

一、prototype

几乎所有的函数(除了一些内建函数)都有一个名为prototype(原型)的属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以有特定类型的所有实例共享的属性和方法。prototype是通过调用构造函数而创建的那个对象实例的原型对象。hasOwnProperty()判断指定属性是否为自有属性;in操作符对原型属性和自有属性都返回true。

示例:自有属性&原型属性

var obj = {a: 1};
obj.hasOwnProperty("a"); // true
obj.hasOwnProperty("toString"); // false
"a" in obj; // true
"toString" in obj; // true

示例:鉴别原型属性

function hasPrototypeProperty(obj, name){
    return name in obj && !obj.hasOwnProperty(name);
}

二、__proto__

对象具有属性__proto__,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。

function Foo(){}
var Boo = {name: "Boo"};
Foo.prototype = Boo;
var f = new Foo();

console.log(f.__proto__ === Foo.prototype); // true
console.log(f.__proto__ === Boo);   // true
Object.getPrototypeOf(f) === f.__proto__;   // true

三、Object.getPrototypeOf()

一个对象实例通过内部属性[[Prototype]]跟踪其原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。可以调用对象的Object.getPrototypeOf()方法读取[[Prototype]]属性的值,也可以使用isPrototypeOf()方法检查某个对象是否是另一个对象的原型对象。大部分JavaScript引擎在所有对象上都支持一个名为__proto__的属性,该属性可以直接读写[[Prototype]]属性。

示例:原型对象

function Person(name) {
    this.name = name;
}
Person.prototype = {
    constructor: Person,
    sayName: function(){
        console.log("my name is " + this.name);
    }
}
var p1 = new Person("ligang");
var p2 = new Person("Camile");
p1.sayName();   // my name is ligang
p2.sayName();   // my name is Camile

While Object.prototype.proto is supported today in most browsers, its existence and exact behavior has only been standardized in the ECMAScript 6 specification as a legacy feature to ensure compatibility for web browsers. For better support, it is recommended that only Object.getPrototypeOf() be used instead. –MDN

时间: 2024-08-29 10:45:06

详解prototype与__proto__区别的相关文章

prototype和__proto__区别

prototype和__proto__分别是显式原型和隐式原型,直接上代码吧: function person(){ this.age = 12; } person.prototype; //Object let person1 = new person(); person1.__proto__; // Object person1.__proto__ == person.prototype; //true 可以看到显式原型和隐式原型是一样的~~

prototype与__proto__区别

参考链接:http://blog.csdn.net/ligang2585116/article/details/53522741  https://stackoverflow.com/questions/9959727/proto-vs-prototype-in-javascript 一:__proto__和prototype 参考下面的回答: __proto__ is the actual object that is used in the lookup chain to resolve m

详解HTTPS和HTTP区别

刚开始学习HTTP 时,你是否很困惑HTTPS和HTTP有哪些区别?写这篇文章就是来分析分析这个问题的. 在上网获取信息的过程中,我们接触最多的信息加密传输方式也莫过于 HTTPS 了.每当访问一个站点,浏览器的地址栏中出现绿色图标时,意味着该站点支持 HTTPS 信息传输方式.HTTPS 是我们常见的 HTTP 协议与某个加密协议的混合体,也就是 HTTP+S.这个 S 可以是 TLS(安全传输层协议).也可以是 SSL(安全套接层),不过我更认可另一个抽象概括的说法,HTTP+Securit

原码、反码、补码详解 及 >> 和 >>>的区别

前段时间仔细研究了原码.反码.补码的知识,今天又碰到了,没想到又忘了,哎,好记性不如烂笔头~. 后来发现一篇专门介绍这方面的文章,写的很是透彻,便直接引用过来了,并且加了>>和>>>的相关知识,原文地址是:http://www.cnblogs.com/zhangziqiu/ 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号

详解shell脚本括号区别--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]

概述 很多时候我们在写shell脚本的时候总会碰到不同的括号,那么这些不同的括号有什么区别呢? $() 用于命令交换 说明:平时脚本用的``符号也是用于命令交换的哦,和$() 的操作是一样的 ${ } 用于变量替换,这里每次调用环境的时候是需要带一个${ } 但是不带也不会影响 这个定义了变量的范围,比较不容易出错 $[ ] --条件判断用的比较多 用于算术计算,注意里面出现的只有数字 如果在里面输出其他非数字的就报错: $(()) 这个效果和$[ ] 差不多,两个都是计算的 [ ] 条件表达式

ui-router详解(二)ngRoute工具区别

我们了解 angular.js 是一种富客户端单页面应用,所以要在一个页面呈现不同的视图,路由起到了至关重要的作用. angular.js 为我们封装好了一个路由工具 ngRoute ,它是一种靠url改变去驱动视图. angularUI 也为我们封装了一个独立的路由模块 ui-router ,它是一种靠状态 state 来驱动视图. 后者有什么优势:一个页面可以嵌套多个视图,多个视图去控制某一个视图等. ngRoute 使用时需要ui中用ng-view指令指定 如:<div ng-view>

详解equals和==的区别

对于字符串变量: 1.如果使用的类重写了equals()方法,那么equals()比较的是字符串中包含的内容是否相同,否则equals()和==一样比较的是内存地址: 2.==始终比较的是两个变量的内存地址: public class Test1 { public static void main(String[] args) { String s1,s2,s3="abc",s4="abc"; s1=new String("abc"); s2=n

009-Scala的内部类实战详解

009-Scala的内部类实战详解 Scala内部类详解 与java的区别 java的内部类是从属于外部类的 Scala的内部类是从属于对象的 内部类在调用方法的时候传递的内部类只能是由自己本身 欢迎广大爱好者学习交流.也欢迎广大学习爱好者加入 DT大数据梦工厂交流群:462923555 DT大数据微信公众账号:DT_Spark  视频观看链接 http://www.tudou.com/plcover/Yy5F5gsurSE/

重要目录结构详解

ls -d 只显示目录 ls -ld /* 显示根下所有的目录 网卡文件:/etc/sysconfig/network-scripts/ifcfg-eth0 /etc/init.d/network restart   确保ONBOOT=yes Ifdown eth0 && idup eth0 查看:ifconfig blkid 看设备的UUID DNS客户端配置文件:/etc/resolv.conf 网卡文件 优先于 /etc/resolv.conf Setup里面也可配置DNS 主机名解