javascript – Object.create(Object.prototype),Object.create(Object)和Object.create(null)之间的区别

我应该为第一个父对象传递哪个参数,其他人将继承哪些参数,哪一个更有效
Object.create(Object.prototype)

Object.create(Object)

Object.create(null)

Object.create(null)返回一个空对象

Object.create(Object)返回一个函数为什么????(我检查了我的日志,它表示功能…我用console.dir())

Object.create(Object)返回一个非空对象

这整个事情如何工作…我更习惯了Classname .prototype事情:(

不明白这里发生了什么

解决方法

前言:JavaScript使用原型继承,这意味着一个对象可以拥有(通常有)一个原型,这是另一个对象.如果您尝试从不具有的对象获取属性的值,则JavaScript引擎将查找对象的原型(及其原型等)来查找它.

Object.create创建对象.给出Object.create的第一个参数是用作其创建的对象的原型的对象.所以:

// Create an object with a property 'foo'
var a = {
    foo: 42
};

// Create a blank object using `a` as its prototype
var b = Object.create(a);

// Give `b` a property of its own
b.bar = "hi";

这让我们记住了:

                           +---------------+      +-------------------+
                           | [[Prototype]] |----->| (the standard     |
a----------------------+-->| foo: 42       |      | object prototype) |
                       |   +---------------+      +-------------------+   
                       |
    +---------------+  |
b-->| [[Prototype]] |--+
    | bar: "hi"     |
    +---------------+

证明b使用:

console.log(b.foo); // 42
a.foo = 67;
console.log(b.foo); // 67

解决您的某些变体:

var o = Object.create(Object.prototype);

这是无意义的,只需使用var o = {};它做同样的事情(创建一个新的空白对象,其原型是Object.prototype).

var o = Object.create(Object);

创建一个新的空白对象o其原型是Object函数.它不会创建一个函数,只是一个函数对象具有作为其原型的函数.这很奇怪,可能不是你想要的.

var o = Object.create(null);

创建一个新的空白对象o其原型为空.由于它的原型是空的,它没有通常的Object.prototype东西,像toString和valueOf和hasOwnProperty.这是有点不寻常,尽管有它的用例,例如当你使用一个对象作为字典/地图,并不想要这些属性名称的误报. (在ES2015 [又称ES6]中,另一个选项是使用Map代替.)

由于thg435在下面的评论中指出,关于JavaScript的一个令人困惑的事情是,对象的原型与您在功能上看到的原型属性完全不同.如果原型属性具有不同的名称(尽管我无法想象没有大量笨拙的名称),这可能会更好.

一个对象(我们称之为o)有一个原型对象,它继承了属性.函数的原型属性上的对象根本不一定是任何对象的原型.相反,它将被分配为通过new使用该函数创建的任何对象的原型.

示例在此帮助.

function Foo() {
}

函数Foo具有引用对象的属性Foo.prototype.那个对象还没有被用作任何东西的原型.它只是一个分配给Foo对象实例上称为prototype的属性的对象.

var f = new Foo();

现在该对象被用作一个原型,具体来说它是由新的Foo调用创建的f对象的原型.

忽略了一些细节,这一行代码

var f = new Foo();

…基本上这样做:

// Create a blank object,giving it `Foo.prototype` as its prototype
var f = Object.create(Foo.prototype);

// Call` Foo` using that new object as `this`
Foo.call(f);

正如我所说,这留下了几个细节,但希望它有助于清楚功能的原型属性是什么…

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...