Javascript - 使用数组作为函数的参数,并在创建新的原型对象时更改值

Javascript - Using an array as a parameter to a function and changing values when creating new prototype object

本文关键字:创建 原型 对象 数组 参数 函数 Javascript      更新时间:2023-11-08

>我有一个构造函数,其中name是一个字符串,details应该是一个包含动物类型,年龄和颜色的数组。

  function animal(name, details) {
     this.animal_name = name;
     this.animal_details = details;
   }

我想从这个原型创建一个新对象:

var myPet = new animal("Olly", " /* what goes here? */ ");

在这种情况下如何声明数组(它是否像通常的数组声明(创建新对象 myPet 时如何使用它?

注意:这是我以前不使用数组的方法:

function meal (starter, main, side, dessert, drink) {
this.starter = starter;
this.main = main;
this.side = side;
this.dessert = dessert;
this.drink = drink;
}
var myMeal = new meal("soup", "chicken", "garlic bread", "cake", "lemonade");
数组

可以使用方括号内联声明:

var a = [1, 2, 3];

在您的情况下,您可以直接在调用new animal时使用它:

var myPet = new animal("Olly", ["dog", 3, "brown"]);

另一种方法,如果你想以这种方式将所有细节存储在一起,我会采取这种方法,是传入一个对象:

var myPet = new animal("Olly", {type: "dog", age: 3, colour: "brown"});

这意味着您可以按名称访问详细信息:

console.log(myPet.animal_details.type); //dog

你可以声明一个这样的数组:

var myPet = new animal("Olly", ['cat','white','big']);
//myPet.animal_details[0] === 'cat';

但我认为一个对象会更适合您的解决方案

 var myPet = new animal("Olly", {type: 'cat',color: 'white', size: 'big'});
 //myPet.animal_details.type === 'cat';
 //myPet.animal_details.color === 'white';
 //myPet.animal_details.size === 'big';

您可能会发现使用对象而不是数组更容易,因为如果默认属性不存在,则定义默认属性会更容易。对象的结构对于处理这种类型的数据也更好一些,imo:

function Animal(details) {
  this.name = details.name || 'Dave';
  this.age = details.age || 10;
  this.location = details.location || 'Dorset';
}
var cat = new Animal({ name: 'Simon', location: 'London' });
// Object { name: "Simon", age: 10, location: "London" }

PS. 始终捕获您的构造函数名称。

当然,如果您不担心默认值,而只是希望将对象中指定的项目添加到实例中,那么这是一种简单的使用方法:

function Animal(details) {
  for (var p in details) {
    this[p] = details[p];
  }
}
var cat = new Animal({ name: 'Simon', location: 'London' });
// Object { name: "Simon", location: "London" }

您可以使用此方法为每个实例动态添加详细信息:

//Base Animal Class
function Animal(name,options) {
    //Localise Class Variable
    var me = this;
    //Assign name to class variable
    me.name = name;
     //Assign details dynamically, depends on every instance
     for(var index in options) {
        me[index] = options[index];
     }
}
  //Create  Animal Instance
  var PetInstance = new Animal("Max",{
      age:11,
      kind:"Pudel"
  });
  console.log(PetInstance);
  //Create Another Animal With Different Details
  var PetInstance2 = new Animal("Foo",{
      age:22,
      kind:"Doberman"
  });
  console.log(PetInstance2);

请参阅此 JSFiddle 示例:http://jsfiddle.net/shako92/bretpu5c/

您可以使用即时数组表示法:['Furry', 'Sharp nails', 'Black'] .尽管您可能希望使用对象,因此您不依赖于"我使用哪个索引来放置皮肤类型?所以像这样:

{
  'skin':'Furry',
  'paw':'Sharp nails',
  'color':'Black'
}

(如果这对你来说看起来像JSON,那是因为它是,JSON = JavaScript Object Notation(

或者,您可以利用内置的arguments数组来提取(部分(作为数组给出的参数并分配它:

function animal(name) {
  this.animal_name = name;
  this.animal_details = arguments.slice(1); // get a "slice" of the arguments array starting at index 1 (skipping the name argument)
}
var myPet = new animal("Olly", 'Furry', 'Sharp nails', 'Black');

你应该尝试在函数中使用'arguments' var,就像这样:

function a (){
  for(arg in arguments){
    console.log(arg);
  }
}
a(1,2,3,4,5,6,7);

结果将是:

1
2
3 [...]

这样,您就可以让您的代码变得简单而有用。