JS中Object对象的原型概念基础


Posted in Javascript onJanuary 29, 2018

对象概念

在 javascript 中, 一切引用类型均为对象。 如 function Foo () {} 中,Foo本身就是一个对象的引用。

创建对象方式 字面量方式 new 构造函数函数声明 Object.create

字面量对象

javascript语言级别快速创建对象的实例

var obj = {foo: 'foo', bar: 'bar'}; // Object对象字面量
var obj2 = [obj, 'foo', 'bar']; // Array数组字面量
var obj3 = /^[a-zA-Z0-9]$/; // RegExp正则字面量
var obj4 = function(){}; // Function函数字面量

new 构造函数

通过内置对象的构造函数,或者自定义的函数。 使用 new 操作符,创建一个对象,并且执行构造函数方法。

var obj = new Object();
var obj2 = new Array(1000);
var obj3 = new RegExp('^[a-zA-Z0-9]$');
var obj4 = new Function('a', 'b', 'return a + b;');

函数声明

函数声明创造的对象. 函数属于特殊的对象.

function Foo() {}
Foo instanceof Object;
Foo instanceof Function;

Object.create

传入一个对象作为返回对象的原型,创建一个新对象, 并将新对象的原型指向传入的对象中。

var foo = {
 'foo': 'foo',
 'bar': 'bar'
};
var o = Object.create(foo); // o.__proto__ = foo
console.log(o.foo); // o.__proto__.foo

使用Object.create(null) 可以返回一个字典型对象.

var o = Object.create(null);
o instanceof Object; // return false;
o.toString(); // Uncaught TypeError

对象原型

每一个对象都有一个内置的 __proto__ 属性指向构造它的函数prototype属性. 而构造函数的

prototype.constructor 则指向构造函数本生。一个对象的属性的寻找过程由以下几个部分组成:

寻找对象属性的数据描述符(writable, value)或存取描述符(getter, setter),如果查询到了,则返回 对应的值。如果查询不到,则进入第2步骤。寻找对象属性的值是否有被显示定义 (可以通过 Object.getOwnPropertyNames)检测,如果对象属性定义了,则返回定义的值。 如果没有,则进入第3步骤。寻找对象的隐藏原型__proto__对象的属性,规则同1,2步骤。如果还未找到,则重复第3步骤, 直到__proto__ 为null 为止。

具体案例如下图所示:

JS中Object对象的原型概念基础

检测对象原型

测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性

instanceof Object.prototype.isPrototypeOf

instanceof

运算符,语言级别的检测对象的原型链是否包含构造函数的原型

function Foo () {}
Foo instanceof Function; // return true
Foo instanceof Object; // return true

模拟instanceof查找对象的原型链的构造函数是否包含传入的构造函数, __proto__ 在一些特定的浏览器有暴露给用户

function Bar () {}
function isInstanceof (obj, Constructor) {
 if (obj === null) {
 return false;
 }
 // 忽略 string, number, boolean, null, undefined 类型干扰
 if (!~['object', 'function'].indexOf(typeof obj)) {
 return false;
 }

 var prototype = obj.__proto__;
 while(prototype) {
 if (prototype.constructor === Constructor) {
  return true;
 }
 prototype = prototype.__proto__;
 }
 return false;
}
isInstanceof(Bar, Function);
isInstanceof(Bar, Object);

isPrototypeOf

构造函数的原型对象自带的函数属性, 用于检测目标对象的原型链中是否存在构造函数的原型对象。

function Baz () {}
var baz = new Baz();
Baz.prototype.isPrototypeOf(baz);
Function.prototype.isPrototypeOf(baz);
Object.prototype.isPrototypeOf(baz);

获取对象原型 Object.getPrototypeOf __proto__

var o = {};
var prototype = Object.getPrototypeOf(o);
console.log(prototype === Object.prototype); // return true
// 部分浏览器有效
var o2 = {};
console.log(o2.__proto__ === Object.prototype); // return true

设置对象原型 Object.create Object.setPrototypeOf

Object.create

返回一个对象,并设置它的原型

function Foo () {}
 function Bar () {}
 Foo.prototype.foo = 'foo';
 Bar.prototype = Object.create(Foo.prototype); 
 Bar.prototype.constructor = Bar; // 修正原型链的constructor
 var o = new Bar();
 console.log(o.foo); // return foo;
 console.log(o instanceof Bar); // return true

Object.setPrototypeOf

直接设置对象的隐式原型__proto__

function Foo () {}
 Foo.prototype.name = 'foo';
 var o = Object.create(null);
 Object.setPrototypeOf(o, Foo.prototype);
 console.log(o.name); // return foo

小结

对象具有许多考验开发者的一些知识点。能够完全理解并整理出来是不容易的。后续我会针对对象的继承做个详细的介绍。感谢你对三水点靠木的支持。

Javascript 相关文章推荐
js为数字添加逗号并格式化数字的代码
Aug 23 Javascript
自定义的一个简单时尚js下拉选择框
Nov 20 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
理解Javascript图片预加载
Feb 23 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
Nov 25 Javascript
ajax接收后台数据在html页面显示
Feb 19 Javascript
探索Vue高阶组件的使用
Jan 08 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
Jul 13 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
Sep 17 Javascript
关于vue里页面的缓存详解
Nov 04 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
Mar 02 Javascript
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
vue.js实现只弹一次弹框
Jan 29 #Javascript
javascript trie前缀树的示例
Jan 29 #Javascript
Vue官网todoMVC示例代码
Jan 29 #Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
Jan 29 #jQuery
Angular2 父子组件通信方式的示例
Jan 29 #Javascript
jQuery代码优化方法总结
Jan 29 #jQuery
javascript代码优化的8点总结
Jan 29 #Javascript
You might like
php session 写入数据库
2016/02/13 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
Jquery搜索父元素操作方法
2015/02/10 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Windows下python3.7安装教程
2018/07/31 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
python中doctest库实例用法
2020/12/31 Python
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
忠诚与背叛观后感
2015/06/04 职场文书
亮剑精神观后感
2015/06/05 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
卫生主题班会
2015/08/14 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书