你不明白的几件事:
- 原型不是特定于对象的属性。它是用于制作它的函数的属性。
- 在这种情况下,创建对象字面量的东西可以在 JavaScript 中创建所有内容
您可以直接从任何对象的构造函数属性访问原型,并且在大多数情况下至少添加属性(但您通常不能替换核心本机对象构造函数的整个原型)。在对象文字的情况下,它将是这样的:
var obj = {};
//BIG NOTE: don't do this in real code. Just goof around in a console or a test project
obj.constructor.prototype.sayHi = function(){ console.log('HI'); }
var anotherObj = {};
anotherObj.sayHi(); //'HI'
所以,是的,对吗?但这就是问题所在。这些也有效:
'bob'.sayHi();
[].sayHi();
new Date().sayHi();
document.sayHi();
(6).sayHi();//have to put 6 in parens because it handles '.' differently
对象字面量是使用核心 Object 构造函数创建的。对象构造函数有一个简单的实例,用作原型链开头的原型,用于 JavaScript 中几乎所有可以想象的事情。自prototype.js 以来没有人这样做过,因为很可能会出现严重奇怪的问题。
一般来说,无论您想对原型做什么,都可能会在不同的方向上进行更好的尝试。将您的对象文字设置为新函数构造函数的原型。这样你就有了继承选项,而不会破坏页面上的所有 JS。
通常认为弄乱 Object 构造函数的原型是一个非常糟糕的主意。我会说 Function.prototype 也是你想要远离的。不用于为其他本地构造函数构建原型对象的对象构造函数通常被认为是原型调整的公平游戏,因此我们可以做一些事情,例如在旧 IE 中添加缺少的数组方法。