var a = {}之间的差异;和var a = new functionObj();

时间:2013-10-22 12:56:42

标签: javascript

之间有什么区别吗?
var a= { 
    grade: "A",
    price: 10
}; 

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

1 个答案:

答案 0 :(得分:3)

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

您的第二个使用构造函数。关于构造函数的一个有用的事情是它们有一个对象被分配给使用它们构造的对象作为对象的 prototype 。这意味着如果您在对象上引用它没有自己的副本的属性,引擎会查看对象的原型以查看 it 是否具有它。这是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

在那里,c1c2个对象从其共享原型继承属性areacircumference。我们创建的每个对象都会在我们new Circle时得到它的原型;分配给它的原型是Circle.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非常适合这种情况。