2

有没有区别

var a= { 
    grade: "A",
    price: 10
}; 

function functionObj(){
   this.grade="A";
   this.price=10;   
}
var a = new functionObj(); 
4

1 回答 1

3

您的第一个是一次性的:它创建一个与其他对象没有任何共同点的单个对象(当然,所有对象都具有共同点除外)。

您的第二个使用构造函数。构造函数的有用之处之一是它们有一个对象,该对象被分配给使用它们作为对象的原型构造的对象。这意味着如果您引用对象上没有它自己的副本的属性,引擎会查看对象的原型以查看是否具有它。这是 JavaScript 原型继承的基础。

例如,第二种形式允许您通过它们的共享原型创建具有共享特征的多个对象。

具体例子:

function Circle(r) { // Constructor function names are initially capitalized by convention
    this.radius = r;
}
Circle.prototype.area = function() {
    return this.radius * this.radius * Math.PI;
};
Circle.prototype.circumference = function() {
    return this.radius * 2 * Math.PI;
};
Circle.prototype.name = "Circle";

var c1 = new Circle(10);
console.log(c1.name);   // "Circle"
console.log(c1.area()); // 314.1592653589793

var c2 = new Circle(5);
console.log(c2.name);   // "Circle"
console.log(c2.area()); // 78.53981633974483

在那里,和c1对象c2从它们的共享原型继承属性。当我们这样做时,我们创建的每个对象都会得到它的原型;分配给它的原型是我们这样做时指向的对象。如您所见,原型上的属性可以引用任何内容,包括函数。areacircumferencenew CircleCircle.prototype

不必使用构造函数来使用原型,自从 ECMAScript 第 5 版问世以来就没有了。您可以通过以下方式直接分配原型Object.create

var circlePrototype = {
    area: function() {
        return this.radius * this.radius * Math.PI;
    },
    circumference: function() {
        return this.radius * 2 * Math.PI;
    },
    name: "Circle"
};

var c1 = Object.create(circlePrototype);
c1.radius = 10;
console.log(c1.name);   // "Circle"
console.log(c1.area()); // 314.1592653589793

var c2 = Object.create(circlePrototype);
c1.radius = 5;
console.log(c2.name);   // "Circle"
console.log(c2.area()); // 78.53981633974483

构造函数只是将所有部分(原型和初始化逻辑)保存在一个整洁的地方。构造函数的缺点是它们倾向于将你推向一种“类式”的方式来看待原型继承。尽管类继承有用且流行,但它并不是唯一的游戏。想要在另一个对象前面创建一个门面的对象并不少见:Object.create非常适合这种情况。

于 2013-10-22T13:04:39.620 回答