三种不同的Javascript对象声明,但只有一种似乎有效?

三种不同的Javascript对象声明,但只有一种似乎有效?,javascript,Javascript,我的HTML页面中有三个简单的Javascript对象定义。第一个可行,但其他的似乎会在页面上导致错误。我有兴趣了解哪种方式是在Javascript中声明对象最常用的方式,哪种方式是在Javascript中声明对象的最佳方式。我使用了C++、java和.NET框架,似乎有一种标准的方法来声明这些类型的OOP语言中的对象。p> 我想找到一种标准的方法来声明对象,这样我的代码在我工作的所有网页上都是标准的。也就是说,我希望我的方法和属性都在声明类型的对象中声明,而不是像我在代码中看到的那样添加它们

我的HTML页面中有三个简单的Javascript对象定义。第一个可行,但其他的似乎会在页面上导致错误。我有兴趣了解哪种方式是在Javascript中声明对象最常用的方式,哪种方式是在Javascript中声明对象的最佳方式。我使用了C++、java和.NET框架,似乎有一种标准的方法来声明这些类型的OOP语言中的对象。p> 我想找到一种标准的方法来声明对象,这样我的代码在我工作的所有网页上都是标准的。也就是说,我希望我的方法和属性都在声明类型的对象中声明,而不是像我在代码中看到的那样添加它们

我还声明了一个空对象,我认为这是正确的

 var Ball = {}; //Shouldn't this be an empty object
问题:我认为我不能完全确定对象在这个意义上的含义,以及它应该如何在Javascript对象中使用?

例如:在java或C++中,<强>新< /St>>操作符创建对象的新实例。如下图所示

 class PPP {
    int temp;
 }

 PPP testobject = new PPP(); 
上面是我将如何在Java中创建类PPP的实例,但在Javascript中如何实现这一点似乎有所不同,因为我认为Object关键字把我抛在了这里,我读到(不确定在哪里)Javascript有些不同,因为一切都是函数或其他东西

代码:

更多代码:

下面也是对象代码,但它有一个函数objectName()作为声明,我认为这对我来说非常混乱。这是用什么材料建造的

Car c = new Object();
c.desc = somevalue;
c.color = another value;
c.getInfo = function getInfo() {
      someCodeGoesHere;
}
但在我看到的一些例子中,要在类之外声明函数,必须这样做。所以我认为原型工作用于大多数事情

  Car.prototype.getInfo = function() {
     return 'A ' + this.color + ' ' + this.desc + '.';
  };
在我看到的示例中,它是如何定义的

function Car (desc) {
    this.desc = desc;
    this.color = "red";
    this.getInfo = function getInfo() 
    {
        return 'A ' + this.color + ' ' + this.desc + '.';
    };
}

var car = new Car('Porsche boxter');
car.color = "blue";
alert(car.getInfo()); 

与您可能认为的相反,
对象
不是一个简单的对象-它是一个函数。这很容易检查:

console.log(typeof Object); // 'function'
new
word结合使用时,此函数用于通过
Object
函数中定义的通用模板构建对象。例如:

var myCar = new Object(); // function `Object`, build me an object!
然后在以下行中向该对象添加一些新特性:

myCar.make = "Ford";
myCar.model = "Mustang";
myCar.year = 1969;
这一切都很好-只是你可以一步完成,这应该更快一点,更容易阅读:

var myCar = {
  make: 'Ford',
  model: 'Mustang',
  year: 1969
};
但问题是,对象是用一个特定的函数构建的——它的构造函数。您可以创建自己的构造函数:

function Pickup() {
  this.make  = 'Ford';
  this.model = 'Mustang';
  this.year  = 1969;
}
。。。然后使用它来构建对象:

var myPickup = new Pickup();
console.log(myPickup.make); // 'Ford';
请注意
console.log(myCar)
console.log(myPickup)
之间的区别:在第一种情况下,它是一些普通的
对象
,在第二种情况下,它是
拾取


现在我们来看一下您遇到的错误:请参阅,
new
关键字是为配合函数使用而设计的。所以这个

var testObj = new Object();
    testObj.tst = "test";

var AA = new testObj();
。。。这完全是错误的。我已经展示了如何创建自己的构造函数,但还有另一种方法-可以创建一些原型对象,然后将其用作无限(某种)副本的模板。像这样:

var carPrototype = {
  make: 'ZAZ',
  model: 'Zaporotzets',
  year: '2014'  
};

var myOtherCar = Object.create(carPrototype);
var yetAnotherCar = Object.create(carPrototype);

console.log(myOtherCar === yetAnotherCar); // false
console.log(myOtherCar.make === yetAnotherCar.make); // true

myOtherCar.make = 'Ferrari';
myOtherCar.model = 'Testarossa';
console.log(myOtherCar); // Object { make="Ferrari", model="Testarossa", year="2014"}
console.log(yetAnotherCar); // Object { make="ZAZ", model="Zaporotzets", year="2014"}

看到了吗?这是由单个模板创建的两个不同且独立的对象。您可以单独修改这些对象的属性,但默认情况下,它们都在prototype对象中定义了一些值—用作
对象的值。创建
参数。

我知道这是您真正想要的方法:

function testObj() {
    this.tst = "test";
}
var AA = new testObj();
console.log(AA.tst); // "test"
console.log(typeof AA); // object, not a function ;)

JavaScript中有许多模式。两种常见的是对象文本和构造函数,请注意构造函数只是一个函数,按照惯例,它以大写字母开头,例如
Animal
Car

最简单的方法是:

var obj = {};

与构造器一起:

function Car(name) {
    this.name = name;
    this.showName = function() {
        console.log("my name is", this.name);
    }
}

var lulu = new Car("lulu"), woowoo = new Car("woowoo");

lulu.showName();
您可以在中阅读有关模块模式的更多信息


中的构造函数模式不,我试图找出,一般来说,如果我要用Javascript创建一个类,它将是最可读的,以供以后参考,以及最好的方法是什么。在第一个示例中,您只需在需要时添加属性。所以如果它是一类动物,我需要添加一个咆哮属性,你只需要在代码中的某个点输入它,对吗?但是第二种方法都是内部的。您可以使用
obj.wahlah=something将属性附加到对象通常,如果您使用构造函数模式,您在类中定义了所有内容。函数Car(name){code here}----是出现在变量声明中还是出现在类之后?函数
Car
实际上是“类定义”。这是你的目标应该如何的蓝图。类定义是一个蓝图,就像建筑物的蓝图一样,使用它,可以根据蓝图创建对象,因此我可以在创建后添加两个方法或属性,这不会影响创建的其他对象。所以在现实中,一个对象可以有2个属性和5种方法,而另一个对象可以有3个属性和10种方法。是的。但实际上,您可以防止
对象发生这种“属性蠕变”。defineProperty
)属性蠕变到底是什么?Object.defineProperty是如何使用的?属性蠕变=>在最初设计的对象上创建更多属性。这里有一个关于
对象的定义属性(我建议检查
对象.freeze()
对象.seal()
);您可以将构造函数用于“类”定义,并在其中定义特定于实例的成员,然后在原型上定义共享成员。有关更详细的解释,请查看以下答案:
var obj = {};
var obj = { foo: 123, bar: 3.14, wah: "hello", lah: function() { } };
function Car(name) {
    this.name = name;
    this.showName = function() {
        console.log("my name is", this.name);
    }
}

var lulu = new Car("lulu"), woowoo = new Car("woowoo");

lulu.showName();