面向对象的JavaScript

时间:2011-01-19 12:10:49

标签: javascript oop

我的代码esp中是否有任何错误 var newpoint [0] = new Point; 。我想知道如何在javascript中做oop

function Point()
{
    var x;
    var y;
}

var length = 1;
var arrayindex;
var newpoint[0] =  new Point;
newpoint[0].x = 10;
newpoint[0].y = 10;
for(i=0 ; i<10; i ++)
{
    newpoint[length].x = 10*i;
    newpoint[length++].y = 10*i;
}

for(arrayindex in newpoint )
{
    alert('x='+newpoint[arrayindex].x +'y='+newpoint[arrayindex].y);
}

编辑:谢谢大家。我想出了两个代码,需要知道哪一个更好,任何sugesstion和protips。都工作

function Point()
{
    this.x;
    this. y;
}

var length = 0;
var newpoint = [];

for(i=0 ; i<10; i ++)
{
    newpoint[length] =new Point();
    newpoint[length].x = 10*i;
    newpoint[length++].y = 10*i;
}

for(arrayindex in newpoint )
{
    alert('x='+newpoint[arrayindex].x +'y='+newpoint[arrayindex].y)
}

var length = 0;
var newpoint = [];
for(i=0 ; i<10; i ++)
{
    newpoint[length] = {};
    newpoint[length].x = 10*i;
    newpoint[length++].y = 10*i;
}
for(var arrayindex in newpoint )
{
    alert('x='+newpoint[arrayindex].x +'y='+newpoint[arrayindex].y)
}

6 个答案:

答案 0 :(得分:5)

在我评论您的代码之前,请阅读教程:https://developer.mozilla.org/en/JavaScript/Guide

现在进行娱乐:

function Point()
{
    var x; // great a local variable!
    var y; // another one! they drop out of scope... (protip: use 'this')
}

var length = 1; // ???
var arrayindex; // better declare that in the for
var newpoint[0] =  new Point; // that works yes, but only the `new Point` part, 'newpoint[0]' what is that supposed to do?
newpoint[0].x = 10; // there's no x property on a `Point` here
newpoint[0].y = 10;
for(i=0 ; i<10; i ++) // i leaks into global scope
{
    newpoint[length].x = 10*i; // ??? Fails, newpoint is not an array
    newpoint[length++].y = 10*i; // Again, what's the point of this?
}

for(arrayindex in newpoint ) // great! a extremely slow for in to iterate over an array..
// pro tip, this will enumerate over all the _properties_ of the _object_
{
    // usual complain about the missing 'hasOwnProperty' call (TM)
    alert('x='+newpoint[arrayindex].x +'y='+newpoint[arrayindex].y);
}

答案 1 :(得分:2)

您是否尝试将x和y用作属性? 你不需要在函数中声明它们。您可以直接在javascript对象上使用它们。

var newpoint = []; // Declares newpoint as array
var length = 1;
for(var i=0 ; i<10; i ++)
{
    newpoint[length] = {}; //Declares a new object.
    newpoint[length].x = 10*i;
    newpoint[length++].y = 10*i;
}

.x和.y自动关联为对象的属性

答案 2 :(得分:2)

请参阅vo Wetzel的回答

您可能正在寻找与此类似的东西

// OOP style template obj
Point = {
    x:null,
    y:null
};

var newpoint = new Array(); // An array to hold Point type objects

// now add some entriedsto the above array
for(var i=0 ; i<10; i ++)
{
    newpoint[i] = new Point(); // create a new point object
    newpoint[i].x = 10*i; // set the values of the point object you just created
    newpoint[i].y = 10*i;
}

for(var arrayindex in newpoint )
{
    alert('x='+newpoint[arrayindex].x +', y='+newpoint[arrayindex].y);
}​

答案 3 :(得分:2)

您可以使用构造函数来创建点而无需输入很多东西。使用new关键字调用时,此函数中的this关键字指的是正在创建的对象。

此构造函数将xy作为参数并将其放在对象中。

function Point(x, y) {
    this.x = x;
    this.y = y;
}

然后你想拥有一系列积分。在使用之前,您需要先创建它。

var newpoint = [];

添加新点很容易。在函数的构造函数的帮助下,它可能缺乏简洁。

for (var i = 0; i < 10; i ++) {
    newpoint.push (new Point(10 * i, 10 * i));
}
  • new Point(10 * i, 10 * i)使用指定的xy坐标创建Point的新实例。
  • newpoint.push用于将传递的参数添加到数组中。所以不再需要length跟踪!
  • 组合,这会创建一个新点,并将其添加到数组中。

然后要显示它,您可以像以前一样迭代数组。请注意,这次我使用newpoint.length来表示数组的长度。

如果您可以使用上面的数字10,则无需对此循环进行任何修改,因为我们会动态获取长度。

for (var i = 0; i < newpoint.length; i ++) {
    alert('x=' + newpoint[i].x + ' y=' + newpoint[i].y);
}

答案 4 :(得分:0)

newpoint必须首先是一个数组,你不能使用:

var newpoint[0] = new Point(); //newpoint has to be declared on its own to be an array if you like to use [0] indexing;

使用

var newpoint = [];
newpoint[0] = new Point();

var newpoint = [new Point()];  //Cipi's suggestion for oneliner

你需要()类型之后。 new关键字调用构造函数方法,该方法可以接受参数,因此您需要使用()。

var newpoint[0] = new Point();

同样的课程声明也不对 声明是你的构造函数,必须自行返回:

function Point() 
{
    this.x = null; //Or whatever default value you like
    this.y = null; 
    /*
    "This" makes the x and y variables members of the object instead of 
    local variables if the constructor function, without "this" they will 
    be forgotten as soon as the function ends. */
}

您可以在构造函数

中添加方法
function Point() 
{
    this.x = null; //Or whatever default value you like
    this.y = null; 
    this.list = function () 
    { 
        alert(this.x);
    };
}

或使用原型

function Point() 
{
    this.x = null; //Or whatever default value you like
    this.y = null; 
}    
Point.prototype.list = function () 
{
     alert(this.x);
}

答案 5 :(得分:0)

我认为你想这样做:var newpoint = [new Point]。 (你的方法是用新对象初始化元素0,但newpoint的元素0不存在,因为你从未说过newpoint是一个数组。)这样你就可以将数组newpoint的第一个元素初始化为新点,所以:newpoint[0].x = 10可以执行。

但是这样:newpoint[length].x = 10*i将会失败,因为你的数组只有一个元素被初始化,而它是newpoint [0],其他所有元素都是undefined。我想你想首先初始化它们(全部10个),例如:

for(var i=1; i<10; i++)
{
    newpoint.push(new Point());
}

此外,如果您希望能够在您创建的对象中看到x和y,请按如下所示更改Point!

function Point() 
{
    this.x;
    this.y; 
}

然后你的代码运行正常......