几乎所有的 JavaScript 对象都是 Object 的实例;一个典型的对象继承了Object.prototype的属性(包括方法)。

存在两种不具备原型链的创建Object的方法:Object.create(null)和Object.setPrototypeOf(obj, null)。

  • 通过Object.create(null)创建的对象没有prototype:
var a = Object.create(null);
var b = {}
console.log(a); // 没有prototype
console.log(b); // 有prototype
  • 通过设置对象的原型链为null
var a = {}
Object.setPrototypeOf(a, null);
console.log(a);

在Object的原型链上创建的函数,可以被所有Object实例对象调用:

var b = {}Object.prototype.testfn = function (val) {console.log("在原型链上创建函数,参数值为" + val);
}
b.testfn(123); // 在原型链上创建函数,参数值为123

改变Object原型,会通过原型链改变所有对象;除非在原型链中进一步覆盖受这些变化影响的属性和方法。这提供了一个非常强大的、但有潜在危险的机制来覆盖或扩展对象行为。

属性:

  • Object.prototype.constructor
    特定的函数,用于创建一个对象的原型。
  • Object.prototype.proto
    指向当对象被实例化的时候,用作原型的对象。
  • Object.prototype.noSuchMethod
    当未定义的对象成员被调用作方法的时候,允许定义并执行的函数。

属性:Object.prototype.constructor

所有对象都会从它的原型上继承一个 constructor 属性:

var o = {};
o.constructor === Object; // truevar o = new Object;
o.constructor === Object; // truevar a = [];
a.constructor === Array; // truevar a = new Array;
a.constructor === Array // truevar n = new Number(3);
n.constructor === Number; // true

constructor可修改。


属性:Object.prototype.proto(已废弃)

该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。

.__proto__属性是Object.prototype 一个简单的访问器属性,其中包含了get(获取)和set(设置)的方法,任何一个__proto__的存取属性都继承于Object.prototype,但一个访问属性如果不是来源于Object.prototype就不拥有.__proto__属性,譬如一个元素设置了其他的.__proto__属性在Object.prototype之前,将会覆盖原有的Object.prototype。


方法:

  • Object.prototype.defineGetter()【已废弃】
    关联一个函数到一个属性。访问该函数时,执行该函数并返回其返回值。
  • Object.prototype.defineSetter()【已废弃】
    关联一个函数到一个属性。设置该函数时,执行该修改属性的函数。
  • Object.prototype.lookupGetter()【已废弃】
    返回使用 defineGetter 定义的方法函数 。
  • Object.prototype.lookupSetter()【已废弃】
    返回使用 defineSetter 定义的方法函数。
  • Object.prototype.hasOwnProperty()
    返回一个布尔值 ,表示某个对象是否含有指定的属性,而且此属性非原型链继承的。
  • Object.prototype.isPrototypeOf()
    返回一个布尔值,表示指定的对象是否在本对象的原型链中。
  • Object.prototype.propertyIsEnumerable()
    判断指定属性是否可枚举,内部属性设置参见 ECMAScript [[Enumerable]] attribute 。
  • Object.prototype.toSource()
    返回字符串表示此对象的源代码形式,可以使用此字符串生成一个新的相同的对象。
  • Object.prototype.toLocaleString()
    直接调用 toString()方法。
  • Object.prototype.toString()
    返回对象的字符串表示。
  • Object.prototype.unwatch()
    移除对象某个属性的监听。
  • Object.prototype.valueOf()
    返回指定对象的原始值。
  • Object.prototype.watch()
    给对象的某个属性增加监听。

方法:Object.prototype.hasOwnProperty()

hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。

const object1 = {};
object1.property1 = 42;console.log(object1.hasOwnProperty('property1'));
// expected output: trueconsole.log(object1.hasOwnProperty('toString'));
// expected output: falseconsole.log(object1.hasOwnProperty('hasOwnProperty'));
// expected output: false

所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,hasOwnProperty()方法会忽略掉那些从原型链上继承到的属性。(for…in…会遍历出包括继承得到的属性。)

var obj = {prop1: 123
}
var a = Object.create(obj);
a.prop2 = 666;
for (var key in a) {console.log(key, a[key], a.hasOwnProperty(key)); // prop2 666 true; prop1 123 false
}

方法:Object.prototype.isPrototypeOf()

isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象的原型链上。

isPrototypeOf() 与 instanceof 运算符不同。在表达式 "object instanceof AFunction"中,object 的原型链是针对 AFunction.prototype 进行检查的,而不是针对 AFunction 本身。

语法:
prototypeObj.isPrototypeOf(object)
在object对象的原型链上搜寻是否有prototypeObj。
⚠️注:如果 prototypeObj 为 undefined 或 null,会抛出 TypeError。

var a = {}
var b = Object.create(a);
var c = {}console.log(a.isPrototypeOf(b)); // true
console.log(a.isPrototypeOf(a)); // false

方法:Object.prototype.propertyIsEnumerable()

语法:

obj.propertyIsEnumerable(prop)

每个对象都有一个 propertyIsEnumerable 方法。此方法可以确定对象中指定的属性是否可以被 for…in 循环枚举(也就是自定义的属性),但是通过原型链继承的属性除外。如果对象没有指定的属性,则此方法返回 false。

var obj = {prop1: 123
}
var a = Object.create(obj);
a.prop2 = 666;for (var key in a) {console.log(key, a[key], a.propertyIsEnumerable(key)); // prop2 666 true; prop1 123 false
}

方法:Object.prototype.toSource()
⚠️注:该特性是非标准的,请尽量不要在生产环境中使用它。

在谷歌浏览器里试了下,发现会直接报错:

Uncaught TypeError: obj.toSource is not a function

方法:Object.prototype.toLocaleString()
直接调用 toString()方法。
语法:

obj.toLocaleString();

表示对象的字符串。

var a = ["1", "2", "3"]
var b = true;console.log(a.toLocaleString()); // "1,2,3"
console.log(b.toLocaleString()); // "true"

方法:Object.prototype.toString()

var a = ["1", "2", "3"]
var b = true;console.log(a.toString()); // "1,2,3"
console.log(b.toString()); // "true"

方法:Object.prototype.watch()
警告 : 请尽量避免使用 unwatch() 和 watch() . 这两个方法仅在 Gecko 中实现 , 并且他们过去主要作调试用. 另外, 使用 watchpoints 对性能有一系列的副面影响 ,特别是当使用全局对象,如 window. 你应该使用 setters and getters 或 proxies 来替代.
watch() 方法会监视属性是否被赋值并在赋值时运行相关函数。

语法:

obj.watch(prop, handler)

试了一下,在谷歌浏览器里会直接报错:

Uncaught TypeError: o.watch is not a function

方法:Object.prototype.unwatch()

unwatch() 删除一个 watch() 设置的 watchpoint.

语法:

obj.unwatch(prop)

同上watch报错


方法:Object.prototype.valueOf()
valueOf() 方法返回指定对象的原始值。
语法:

object.valueOf()
var a = []
var b = {}
var c = false
var d = "123"
var e = new String("123")console.log(a.valueOf() === []) // false
console.log(b.valueOf() === {}) // false
console.log(c.valueOf() === false) // true
console.log(d.valueOf() === "123") // true
console.log(d.valueOf() === e) // false

【Javascript】Object.prototype相关推荐

  1. 【javaScript】Object.prototype.toString.call() 、 instanceof 以及 Array.isArray() 区别与优化层面的比较

    1. Object.prototype.toString.call() 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object ...

  2. 【js】Object.prototype.hasOwnProperty()

    hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性 例如:obj.hasOwnProperty(prop) 1. 所有 Object 的对象都会有 hasOw ...

  3. 【JavaScript】Object.observe()带来的数据绑定变革

    Object.observe()带来的数据绑定变革 引言 一场变革即将到来.一项Javascript中的新特性将会改变你对于数据绑定的所有认识.它也将改变你所使用的MVC库观察模型中发生的修改以及更新 ...

  4. 【JavaScript】阶段性复习

    [JavaScript]阶段性复习 View / MVVM 框架 对比 React .Angular 和 Vue 相同点 不同点 如何实现一个组件,前端组件的设计原则是什么? Vue computed ...

  5. 【JavaScript】类数组详解

    [JavaScript]类数组详解 文章目录 [JavaScript]类数组详解 什么是类数组 类数组转换成数组 ES6 的方法转数组 callee属性 箭头函数没有arguments HTMLCol ...

  6. 【JavaScript】出现即使设置了ID也获取不到的可能原因与window.onload

    有时候.在JavaScript中.即使设置了ID也有可能出现document.getElementById()获取不到的情况,然后你就開始想document是否写错之类的.事实上根本就不是你的代码的大 ...

  7. 【Javascript】深入理解this作用域问题以及new/let/var/const对this作用域的影响

    理解this作用域 <javascript高级程序设计>中有说到: this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象调用时,t ...

  8. Number()函数转换‘单个数值的数组‘为何是数字?【JavaScript】

    Number()函数转换'单个数值的数组'为何是数字?[JavaScript] 1.Number() 熟悉Number()函数的同学可跳过项 使用Number函数,可以将任意类型的值转化成数值. 原始 ...

  9. 【JavaScript】慢慢进入javascript的大门~~~

    [Javascript]慢慢进入javascript的大门~~~ JavaScript入门 一.基本概念: 01. 是什么? 02. 浏览器怎么执行? 03. JS的组成 04. JS的书写位置 二. ...

最新文章

  1. 基于DoG的特征检测子(SIFT)_学习笔记
  2. mysql取消外码约束_MySQL 关闭子表的外键约束检察方法
  3. 05.elasticsearch-index相关总结
  4. python eel 多线程_利用Eel使JavaScript调用Python程序
  5. Redis Cluster 集群模式原理和动态扩容
  6. 在博客园的博客插入代码块(高亮、行号、缩进、着色)
  7. android+清除循环动画,android - 如何使用ViewPropertyAnimator生成循环动画?
  8. [转]numpy中的np.max 与 np.maximum区别
  9. linux系统C语言实现域名解析功能
  10. rust建的怎么拆除_罗志祥私建泳池已拆除,后续还将接受物业的监督与教育
  11. STL: string:erase
  12. sqlserver 没有备份误删数据_数据库服务器如何备份详细教程!
  13. oracle日期时间
  14. [置顶] 原创鼠标拖动实现DIV排序
  15. 金蝶k3服务器物理内存过高,金蝶k3提示超出内存解决方案
  16. 为什么我们需要PRINCE2认证——上海信息化培训中心
  17. java 1/2等于多少_1/2-2等于多少?
  18. 层次分析法在matlab上的实现
  19. linux+中的su命令,Linux中如何使用SU命令(示例)
  20. 【python】python基础与unittest基础

热门文章

  1. 2021性价比高的移动电源推荐,移动电源性价比排行榜
  2. WireShark(1)
  3. php fgets 换行,php fgets 函数
  4. 小米电脑关机后合上盖子再开机需要两次解决办法
  5. 判断是否有复选框被选中
  6. HTML页面的主体标签是什么,html网页的主体标签是什么?
  7. 如何回复审稿人问题?
  8. v2p更新----保姆级别教程
  9. 芯片之家一周精选,毛线上拉电阻?电容开花了?
  10. 中基鸿业如何正确理解投资理财