prototype与__proto__区别详细介绍


Posted in Javascript onJanuary 09, 2017

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

prototype与__proto__区别详细介绍

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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
使用javascript实现json数据以csv格式下载
Jan 09 Javascript
跟我学习javascript的prototype使用注意事项
Nov 17 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
Nov 23 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
May 17 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
Nov 03 Javascript
JS优化与惰性载入函数实例分析
Apr 06 Javascript
js判断传入时间和当前时间大小实例(超简单)
Jan 11 Javascript
vue 微信授权登录解决方案
Apr 10 Javascript
vue弹窗消息组件的使用方法
Sep 24 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
Aug 01 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
Sep 18 Javascript
前端js中的事件循环eventloop机制详解
May 15 Javascript
jQuery实现二维码扫描功能
Jan 09 #Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 #Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
Jan 09 #Javascript
基于jQuery实现滚动刷新效果
Jan 09 #Javascript
用jQuery实现优酷首页轮播图
Jan 09 #Javascript
AngularJS实现表单验证功能
Jan 09 #Javascript
AngularJS表单基本操作
Jan 09 #Javascript
You might like
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
解析PHP提交后跳转
2013/06/23 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
jquery 查找新建元素代码
2010/07/06 Javascript
javascript 学习笔记(onchange等)
2010/11/14 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
vue初始化动画加载的实例
2018/09/01 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
浅谈Python中用datetime包进行对时间的一些操作
2016/06/23 Python
Python脚本处理空格的方法
2016/08/08 Python
Unicode和Python的中文处理
2017/03/19 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
初一地理教学反思
2014/01/16 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
经典安踏广告词
2014/03/21 职场文书
免职证明样本
2014/10/23 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书