如何从构造函数中的函数返回对象属性?

时间:2019-05-02 15:32:51

标签: javascript arrays object constructor

我正在用JavaScript构建一个小型的世界生成器(较大模拟的一部分)。

我正在尝试通过为其分配函数输出来在构造函数中定义对象的属性。

在下面的代码中,'this.identifier'执行起来就像一个超级按钮,但是我想为例如'this.gender'分配更复杂的功能。

'this.gender'中,我想使用math.random.math.floor循环遍历一个数组(该数组具有两个值,分别是男性和女性)。

当我编写实际功能时,从新的Human对象中删除'this.gender'

 {
   "identifier":42,
   "lifestate":"Alive",
   "health":"100",
   "age":"10",
   "metabolism":"12",
   "econsumption":"11111",
   "parent":"yes"
}
  • 当我将其更改为功能时,性别就会消失。

我尝试使用return语句,但这没什么区别。

class Bluehuman {
  constructor() {
    this.identifier = Math.floor((Math.random() * 100));
    this.lifestate = 'Alive';
    this.health = '100';
    this.age = '10';
    this.metabolism = ['Low','Medium','High'];
    this.econsumption = '11111';
    this.parent = ['Yes','No'];
    this.gender = ['Male','Female']; // Want to change this to a function without dropping from the new Bleuhuman object
    }
  }

var bluehuman = {};
var bluehumans = [];

for (var i = 0; i < 10; i++) {
  bluehuman[i] = new Bluehuman();
  bluehumans.push(bluehuman[i]);
}

var arrayPrint = JSON.stringify(bluehumans);
console.log(arrayPrint)

如何将函数的输出分配给“ this.gender”而不将其从新的bluehuman对象中删除?

2 个答案:

答案 0 :(得分:2)

您不需要功能,表达式就可以解决您的问题

class Bluehuman {
  constructor() {
    this.identifier = Math.floor((Math.random() * 100));
    this.lifestate = 'Alive';
    this.health = '100';
    this.age = '10';
    this.metabolism = ['Low','Medium','High'];
    this.econsumption = '11111';
    this.parent = ['Yes','No'];
    this.gender = ['Male','Female'][Math.round(Math.random())];
    }
  }

var bluehuman = {};
var bluehumans = [];

for (var i = 0; i < 10; i++) {
  bluehuman[i] = new Bluehuman();
  bluehumans.push(bluehuman[i]);
}

var arrayPrint = JSON.stringify(bluehumans);
console.log(arrayPrint)

答案 1 :(得分:1)

您可以将一个函数分配为任何其他值

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\select2\Select2;
use yii\helpers\ArrayHelper;
use app\models\Resume;

    $routeAjax = \yii\helpers\Url::toRoute("resume/resumes");

$js=<<<JS
function getRelatedFields(lao_id){
    $.ajax({
        url: '$routeAjax',
        dataType: 'json',
        method: 'GET',
        data: {id: lao_id},
        success: function (data, textStatus, jqXHR) {
             $('#resumes-persen').val(data.persen);
             $('#resumes-eom').val(data.eom);
             $('#resumes-tgt_perpetugas').val(data.tgt_perpetugas);
             $('#resumes-tgt_pergeseran').val(data.tgt_pergeseran);
        },
        beforeSend: function (xhr) {
            alert('loading!');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log('An error occured!');
            alert('Error in ajax request'+textStatus'\n'+errorThrown);
        }
    });
}

JS;
$this->registerJs($js, \yii\web\View::POS_READY); 


?>

<div class="resumes-form">

    <?php $form = ActiveForm::begin(); ?>


    <?= $form->field($model, 'lao')->widget(Select2::classname(), [
    'data' => ArrayHelper::map(Resume::find()->all(),'lao','lao'),
    'language' => 'en',
    'options' => ['placeholder' => 'Pilih LAO'],
    'pluginOptions' => [
        'allowClear' => true
    ],
    'pluginEvents'=>[
        'select2:select' => 'function(e){getRelatedFields(e.params.data.id);}',
    ]
]); ?>

    <?= $form->field($model, 'persen')->textInput(['type' => 'number','maxlength' => true, 'readOnly'=>false])->label('Perpetugas %') ?>
    <?= $form->field($model, 'eom')->textInput(['maxlength' => true])->label('EOM') ?>

    <?= $form->field($model, 'tgt_perpetugas')->textInput(['maxlength' => true, 'readOnly'=>true])->label('Target Perpetugas') ?>

    <?= $form->field($model, 'tgt_pergeseran')->textInput(['maxlength' => true, 'readOnly'=>true])->label('Target Pergeseran') ?>

    <center>
    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>
    </center>

    <?php ActiveForm::end(); ?>

</div>

然后您可以将其称为:

public function actionResumes($id){
    // you may need to check whether the entered ID is valid or not
    $model =  \app\models\Resume::findOne(['lao'=>$id]);
    return \yii\helpers\Json::encode([
            'eom'=>$model->eom,
            'persen'=>$model->persen,
            'tgt_pergeseran'=>$model->tgt_pergeseran,
            'tgt_perpetugas'=>$model->tgt_perpetugas
        ]);
    }

,如果直接将其登录到控制台,也会看到它:

heroku pg:reset DATABASE_URL

但是如果您在其上调用SELECT CURDATE() - interval 1 DAY + interval 2 ,它将变成仅包含数据,函数(以及许多其他内容)的字符串。