【问题标题】:Javascript Inheritance and Object LiteralJavascript 继承和对象字面量
【发布时间】:2013-02-22 06:41:00
【问题描述】:

在 JavaScript 中,据说对象字面量具有原型链接,但是 函数对象同时具有原型链接和原型属性。

那么,基于上述内容,是否可以说继承(使用原型属性)仅适用于函数对象(构造函数版本)而不适用于对象字面量?

另外,补充一点,__proto__ 属性并非在所有浏览器中都可以访问...

【问题讨论】:

  • 在使用对象字面量时,您不能更改现有对象的原型或指定原型,因此,如果我正确理解您的问题,我会说是的。
  • 所以这将涉及大多数浏览器行为(除了少数像 Firefox 允许设置“proto”链接)...所以可以说继承可以使用 Object 字面量实现(但仅限于允许设置 proto 链接的浏览器,如 Firefox )?
  • 对象字面量本身继承自Object.prototype,因此您仍然可以获得继承,但您目前无法设置比使用字面量语法时更长的原型链,就像使用构造函数一样。构造函数不是唯一的方法。您可以改用Object.create
  • __proto__ 属性是标准的,甚至在 FF 中已弃用。我只是在谈论官方规格。但正如系统所说,当然每个对象都继承自某些东西,唯一的问题是您是否可以影响原型链。
  • 可以使用Object.create(proto) 方法对对象字面量进行继承。此外,您可以通过这种方式创建一个对象,该对象甚至不从基础对象继承(使用Object.create(null))。

标签: javascript jquery oop prototypal-inheritance


【解决方案1】:

短版

是:原型链不能通过分配给对象的prototype 属性来设置或修改。您不能通过使用对象字面量创建对象然后给它一个名为prototype 的属性来设置继承。此类属性将被称为prototype,但不会考虑用于原型继承。

更长:

如果您访问undefined 的属性,则会检查该对象的继承链。所以,如果obj['prop']undefined,那么obj.prototype['prop'] 将被检查。在许多浏览器中,prototype 属性在内部实现为__proto__ 属性,但这不是重点。相反,重点是如果某个属性是undefined,则检查对象的原型是否有该属性。

正如人们在 cmets 中所说,只有通过将对象分配给函数的 prototype 属性,然后将该函数用作构造函数,才能赋予对象提供上述继承的原型。

但是,构造函数调用产生的对象的prototype 属性不是object.hasOwnProperty('prototype')。另一方面,如果您将prototype 属性分配给一个对象,那么该对象将为object.hasOwnProperty('prototype'),但随后object.prototype 将与原型链无关——它只是一个常规属性,并且会碰巧打电话给prototype

为了证明这一点:

var foo = {};
foo.prototype = {bar: 'hello'};
console.log(foo.bar); // undefined
console.log(foo.prototype); // Object {bar: "hello"}
console.log(foo.hasOwnProperty('prototype')); // true

var Foo = function() {};
Foo.prototype = {bar: 'hello'};
var f = new Foo;
console.log(f.bar); // 'hello';
console.log(f.hasOwnProperty('bar')); // false
console.log(f.prototype); // undefined
console.log(f.hasOwnProperty('prototype')); // false

【讨论】:

    猜你喜欢
    • 2015-03-12
    • 2012-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多