Object.create 以及 Object.setPrototypeOf
第一部分
Object.crate() 方法是es5中的关于原型的方法, 这个方法会使用指定的原型对象以及属性去创建一个新的对象。
语法
Object.create(proto, [ propertiesObjecy ])
参数:
proto
必须的。一个对象,它是新创建的对象的原型。
propertiesObject
可选的。 该参数是一组属性和值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符, 这些属性描述符的结构与Object.defineProperties()
的第二个参数一样。 注意:该参数对象不能是 undefined
,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。
抛出异常
如果 propertiesObject
参数不是 null
也不是
对象,则抛出一个 TypeError
异常。
例子
使用 Object.create 实现类式继承。
下面的例子演示了如何使用Object.create()来实现类式继承。这是一个单继承。
//Shape - superclass
function Shape() {
this.x = ;
this.y = ;
} Shape.prototype.move = function(x, y) {
this.x += x;
this.y += y;
console.info("Shape moved.");
}; // Rectangle - subclass
function Rectangle() {
Shape.call(this); //call super constructor.
} // subclass extends superclass
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle; var rect = new Rectangle(); console.log('Is rect an instance of Rectangle?',
rect instanceof Rectangle); // true
console.log('Is rect an instance of Shape?',
rect instanceof Shape); // true rect.move(, ); //Outputs, "Shape moved."
这里的继承还是很好理解的,值得注意的是,使用这种方式继承,不会出现new。
常见问题: Object.create(null) 和 {} 区别是什么
在vue源码中,就会经常出现 Object.create(null)。 这样的结果就是 Object.create(null)创建的对象是不会以Object的原型为构造函数的,因为这个对象就没有原型。
console.log(Object.create({}).toString); // function toString() { [native code] }
console.log(Object.create(null).toString); // undefined
使用 Object.create
的 propertyObject
参数
var o; // 创建一个原型为null的空对象
o = Object.create(null); o = {};
// 以字面量方式创建的空对象就相当于:
o = Object.create(Object.prototype); o = Object.create(Object.prototype, {
// foo会成为所创建对象的数据属性
foo: {
writable:true,
configurable:true,
value: "hello"
},
// bar会成为所创建对象的访问器属性
bar: {
configurable: false,
get: function() { return },
set: function(value) {
console.log("Setting `o.bar` to", value);
}
}
}); function Constructor(){}
o = new Constructor();
// 上面的一句就相当于:
o = Object.create(Constructor.prototype);
// 当然,如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码 // 创建一个以另一个空对象为原型,且拥有一个属性p的对象
o = Object.create({}, { p: { value: } }) // 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的:
o.p =
o.p
// o.q =
for (var prop in o) {
console.log(prop)
}
//"q" delete o.p
//false //创建一个可写的,可枚举的,可配置的属性p
o2 = Object.create({}, {
p: {
value: ,
writable: true,
enumerable: true,
configurable: true
}
});
第二部分
Object.setPrototypeOf() 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 null
。
语法:
Object.setPrototypeOf(obj, prototype)
参数
- obj
- 要设置其原型的对象。.
- prototype
- 该对象的新原型(一个对象 或
null
).
示例
var dict = Object.setPrototypeOf({}, null);
一个例题:
其中的第一个题为true还是不难理解的, 开始这个对象obj的原型是 {name: "king"},然后因为是传递了引用,接着把原型又赋值给了null,但是呢,他们的地址没有变,还是在老地方,只是原型发生了变化。
Object.create 以及 Object.setPrototypeOf的更多相关文章
- (转)es6中object.create()和object.assign()
今天学习javascript面向对象,在学习Obejct方法时了解到create方法,偶像想起之前使用的assign方法,顺带查找一番,感觉这篇博客讲解详细,遂转载. 先简单提一下装饰器函数,许多面向 ...
- Object.create 和 Object.assign
Object.assign(target, ...source) 1.Object.assign方法只会拷贝源对象自身(不包括原型)的并且可枚举的属性到目标对象,使用源对象的get和目标对象的set, ...
- js中的new操作符与Object.create()的作用与区别
js中的new操作符与Object.create()的作用与区别 https://blog.csdn.net/mht1829/article/details/76785231 2017年08月06日 ...
- Object.create() 实现
if (typeof Object.create !== 'function') { Object.create = function (o) { function F() {} F.prototyp ...
- Object.create()和new object()和{}的区别
Object.create()介绍 Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString ...
- js-new、object.create、bind的模拟实现【转载备忘】
//创建Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } function _ ...
- ES5 Object.create 方法
Object.create(proto[, propertiesObject])The Object.create() method creates a new object with the spe ...
- Object.create() __https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create
Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象. 语法 Object.create(proto[, propertiesObject]) 参数 proto 新创建对 ...
- js 继承,Object.setPrototypeOf | Object.getPrototypeOf | Object.create class
https://juejin.im/post/5cfd9d30f265da1b94213d28#heading-14 https://juejin.im/post/5d124a12f265da1b91 ...
随机推荐
- Java代码执行机制
一.java源码编译机制 一个java文件编译为.class文件的流程图. Parse an Enter阶段: Parse:将代码字符串转换为token序列(com.sun.tools.javac.p ...
- Redis实现用户关注功能
最近项目要涉及到粉丝关注问题,权衡再三还是使用Redis实现比较方便,使用Redis的有序集合可以做到根据关注的时间有序的取出列表,假设我的ID是me,别人的ID是other. 1. 添加关注 添加关 ...
- linux手动安装配置 mysql5.7
本文原出处地址 https://www.cnblogs.com/mujingyu/p/7689116.html 一.安装前的检查 1.1 检查 linux 系统版本 [root@localhost ...
- c语言判断是否是utf8字符串,计算字符个数
#include <stdio.h> #include <string.h> #include <stdlib.h> /********************** ...
- 一个android dex 转java源码工具
和dex2jar,smali2java比起来,这个工具至少结果是正确的,前两者对于循环,异常等的处理明显逻辑就是错误的. 该小工具是基于androguard制作,本来是想自己写一个,后来一找居然有现成 ...
- windows下启动Apache报443错误!
windows下启动apache报make_sock: could not bind to address [::]:443错误! 查看指定端口的占用情况 netstat -aon|findstr & ...
- git配置项目
1.下载安装完git 2.在git oschina上发布项目 3.管理-公匙管理 4.git上面生成公匙 $ cat ~/.ssh/id_rsa.pub 5.将公匙复制进 git oschina 管理 ...
- Shell脚本标准
#!/bin/bash #Usage: # ./shell.sh dbname user passwd #----------------------------------------------- ...
- Educational Codeforces Round 59 (Rated for Div. 2)
熬夜爆肝,智商急剧下降 坐标UTC+8晚上23:35开始 晚上脑袋转的慢,非常慢 T1上来先做还花了好几分钟 T2本来是有式子的我TM写数位DP写炸了然后才发现是有公式 T3英语不好,一开始题意没读懂 ...
- 洛谷4316 绿豆蛙的归宿(DAG递推/概率dp)
题目大意: 给定一个DAG,求起点到终点的路径长度期望 根据题意可以知道每一条边都有一定概率被走到 那么\(\displaystyle\begin{aligned} Ans = \sum_{e \in ...