объектно-ориентированный JavaScript - PullRequest
0 голосов
/ 19 января 2011

Есть ли ошибка в моем коде esp var newpoint [0] = new Point; .Я хочу знать, как сделать упс в JavaScript

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 ]

5 голосов
/ 19 января 2011

Прежде чем комментировать ваш код, прочитайте Учебное пособие: 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);
}
2 голосов
/ 19 января 2011

Вы можете использовать функцию конструктора для создания точек без необходимости набирать много вещей.Когда вызывается с ключевым словом new, ключевое слово this в этой функции ссылается на создаваемый объект.

Эта функция-конструктор принимает x и y в качестве аргументов и помещает его в объект.

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) создает новый экземпляр Point с указанными x и y координатами.
  • newpoint.push используется для добавления переданного аргумента в массив.Так что больше нет length tracking!
  • В сочетании это создает новую точку и добавляет ее в массив.

Затем, чтобы отобразить ее, вы можете перебрать массивтак же, как и раньше.Обратите внимание, что на этот раз я использую newpoint.length для обозначения длины массива.

Если вы можете указать число 10 выше, вам не нужно вносить никаких изменений в этот цикл, потому что мы получаем длинудинамически.

for (var i = 0; i < newpoint.length; i ++) {
    alert('x=' + newpoint[i].x + ' y=' + newpoint[i].y);
}
2 голосов
/ 19 января 2011

Пожалуйста, смотрите ответ 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);
}​
2 голосов
/ 19 января 2011

Вы пытаетесь использовать 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 автоматически ассоциируются как свойства для объекта

0 голосов
/ 19 января 2011

Я думаю, что вы хотите сделать это: var newpoint = [new Point].(То, как вы это делаете, инициализирует элемент 0 новым объектом, но элемент 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());
}

Кроме того, измените Point, как показано ниже, если вы хотите видеть x и y в созданном вами объекте!

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

Тогда ваш код будет работать нормально ...

0 голосов
/ 19 января 2011

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

Вам нужно () после типа. Новое ключевое слово вызывает метод конструктора, который может принимать параметры, поэтому вам нужно использовать ().

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...