4

假设我有以下代码;

var A = {a:10};
var B = {b:20};
B.prototype = A;
alert(B.a);

我对 Ba 越来越不确定。难道我做错了什么?如何设置对象文字的原型?

我知道如何处理 Constructor 对象。所以下面的代码完美运行

function A(){this.a=10}
function B(){this.b=20}
B.prototype = new A();
b = new B;
alert(b.a);

我该如何为对象文字做呢?

4

3 回答 3

12

对象继承自其构造函数的原型属性,而不是它们自己的。构造函数的原型被分配给[[Prototype]]在某些浏览器中作为属性可用的内部__proto__属性。

所以b要从 继承a,你需要穿上ab继承链,例如

经典原型继承:

var a = {a: 'a'};
function B(){}
B.prototype = a;

var b = new B();
alert(b.a); // a

使用 ES5 Object.create:

var a = {a: 'a'};
var b = Object.create(a);

alert(b.a); // a

使用 Mozilla __proto__

var a = {a: 'a'};
var b = {};
b.__proto__ = a;

alert(b.a); // a
于 2013-03-18T09:18:18.143 回答
3

原型属性通常存在于 Function 对象中。这个原型应该是一个对象,这个对象用来定义一个用构造函数创建的对象的属性。

// Plain object, no prototype property here.
var plainObject = {one: 1, two: 2};

// Constructor, a prototype property will be created by default
var someConstruct = function() {

  // Constructor property
  someConstruct.constructProp = "Some value";

  // Constructor's prototype method
  someConstruct.prototype.hello = function() {
    return "Hello world!";
  }
};

// Another constructor's prototype method
someConstruct.prototype.usefulMethod = function() {
  return "Useful string";
}

var someInstance = new someConstruct();
console.log(someInstance.hello()); // => Hello world!
console.log(someInstance.usefulMethod()); // => Useful string

console.log(someConstruct.constructProp); // => Some value
console.log(someConstruct.prototype); // => {usefulMethod: function, hello: function}

console.log(plainObject.prototype); // => undefined

因此,普通对象没有原型。作为构造函数工作的函数确实有原型。这些原型用于填充使用每个构造创建的实例。

希望有帮助:)

于 2013-03-18T08:21:08.280 回答
0

只有在使用Function对象时才会使用原型,例如,当您使用构造函数时。但是对于对象文字就不需要了。

它们都是非常好的技术,所以这取决于你想在项目中做什么以及你使用或喜欢的 JavaScript 模式。

于 2013-03-18T08:52:02.770 回答