Javascript - 使用数组作为函数的参数,并在创建新的原型对象时更改值
Javascript - Using an array as a parameter to a function and changing values when creating new prototype object
>我有一个构造函数,其中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 [...]
这样,您就可以让您的代码变得简单而有用。
- 创建对象函数原型和代码是错误的
- 创建后指定对象原型
- 什么是“;原型;通过JavaScript中的Object Literal Notation创建的对象的链接
- ES6 const,用于在JavaScript中创建对象原型;这是一种模式吗
- 哪个原型用于创建具有未知标记的节点
- 使用闭包创建原型中引用的私有属性
- 使用sinon.js创建一个“;“间谍对象”;使用基于真实构造函数/原型的间谍方法
- 动态创建原型并推送到数组
- 不创建父对象的原型继承
- 使用 bind 强制创建原型函数的上下文
- 为子对象javascript创建原型
- 什么's在对象内部创建原型方法的缺点
- 为什么重新定义函数如此重要?在任何对象实例化之前创建原型
- 在javascript中创建原型,添加一个新方法来引导日期拾取器
- 为多种类型创建原型的更好方法是什么?
- 使用es6创建原型
- 设置“this"到实例,在创建原型函数期间的回调集中
- 原型继承-在JavaScript中创建原型链(ES-5)
- 如何正确地从Node.js中的另一个文件创建原型对象
- 不创建原型的字符串创建方法