【问题标题】:Change value of function or keep it the same with a prototype?更改函数的值还是与原型保持相同?
【发布时间】:2017-01-17 11:30:54
【问题描述】:

如果设置了参数,如何更改对象的值,如果设置了则不更改

示例:

//parameter is a object
var Main = function(parameter)
{
    this.num = 1;
    this.string = "this"
}

Main.prototype.constructor = Main;

//source is an object
Main.prototype.copy = function(source)
{
    Main.prototype.copy.call(this, source);

    this.num = source.num;
    this.string = source.string;


    return this;
}

//set sub2 to have num is 4 instead of 1
var sub2 = new Main({num:4});

我想知道如何设置一个原型,如果一个参数是et,则可以允许更改原始对象,但如果没有设置参数,则使用 Main 函数中的默认值,或者我会使用一个函数来设置如果参数为空,则将值设置为默认值,如果为空,则设置为参数对象?

谢谢

【问题讨论】:

  • 请显示实际代码。 var object = new object… 总是会导致类型错误。
  • 这只是一个示例,实际代码来自三个 js,您可以在其中声明要更改的参数,例如在创建材质时可以 var mat1 = new THREE.MeshPhongMaterial({color: 0xffffff});
  • 所以你问构造函数参数的color 属性和mat1.color 属性之间的区别是什么?
  • 特别是我在问什么类型的函数可以这样声明一个参数,以便为每个新对象更改属性而无需填写所有参数
  • 我现在知道它是一个以对象为参数的原型,但我不知道如果设置了参数而不知道如何更改对象的值,如果没有设置则不知道跨度>

标签: javascript function object parameters arguments


【解决方案1】:

我发现花了一段时间,我决定查看三个 js 代码以查看属性是如何设置的,我发现要设置属性我需要遍历对象并获取键并设置键对象:这是一个创建行星的例子

    /* parameters = {
    radius : <float>
    tilt : <float>
    distance : <float>
    days : <float>
    years : <float>
    diffuse : <texture>
    specular : <texture>
    normal : <texture>
    bump : <texture>
}
*/
var CelestialObject = function (parameters) {
    var toRadians = 180 / Math.PI;

    this.radius = 1;
    this.tilt = 23.5;
    this.distance = 0;
    this.days = 1;
    this.years = 1;
    this.orbitEccentricity = 0;
    this.diffuse = null;
    this.specular = null;
    this.normal = null;
    this.bump = null;


    var material = new THREE.MeshPhongMaterial();//mesh material
    var geometry = new THREE.SphereGeometry(this.radius, 64, 64);//sphere geometry
    var mesh = new THREE.Mesh(geometry, material);//mesh

    //Apply Textures
    if (this.diffuse = null)
        material.map = this.diffuse;
    else
        material.color = new THREE.Color(0x777777);
    if (this.specular = null)
        material.map = this.specular;
    if (this.normal = null)
        material.normalMap = this.diffuse;
    if (this.bump = null)
        material.bumpMap = this.bump;

    //Set Tilt
    this.SetTilt = function () {
        mesh.rotateZ(this.tilt * toRadians);
    }

    //Rotate 
    var Rotate = function (mesh) {

        requestAnimationFrame(Rotate);

        var hoursInDay = 24;
        var angle = (360 / (this.days * hoursInDay)) * toRadians;

        mesh.rotateY(angle);
    }

    //Revolve
    var Revolve = function (mesh) {

        requestAnimationFrame(Revolve);

        var time = new Date().getTime();
        var hoursInYears = this.years * 365 * 24;

        time += 360 / hoursInYears;

        var xPos = Math.cos(time) * this.distance;
        var zPos = Math.sin(time) * this.distance * this.orbitEccentricity;


        mesh.position.set(xPos, 0, zPos);
    }

    //set mesh
    this.setMesh = function (customMesh, meshURL) {
        var jsonLoader = new THREE.JSONLoader();
        if (!customMesh)
            mesh = new THREE.Mesh(new THREE.SphereGeometry(this.radius, 64, 64), new THREE.MeshPhongMaterial({ color: 0x777777 }));//sphere
        else
            mesh = jsonLoader.load(meshURL);
    }

    //set values
     for (var key in parameters) {
            var newValue = parameters[key];
            this[key] = newValue;
     }


    Rotate(mesh);
    Revolve(mesh);

    return this;
};
//create new planets here with different values
var earth = new CelestialObject();//use default parameters
var mars = new CelestialObject({radius:.4,tilt:25,distance:141,days:1.5,years:2});//uses new parameters

【讨论】:

  • 我不明白你的意思,这个对象Main的目的是什么。你能给我写一个使用这个对象的例子吗?
  • 示例已针对我的用途进行了更新
【解决方案2】:

唯一的区别在于命名法:

// So if you declare object as
var obj1 = {param1: "value1"};

// there is absolutely no difference if you declare it as
var obj2 = new Object({param2: "value2"});

// Its because every object inherits from Object,
// no matter which way is defined.

// Test
console.log(typeof obj1);
console.log(typeof obj2);

console.log(obj1 instanceof Object);
console.log(obj2 instanceof Object);

// Reaction to your comment below:
// Its as complicated as confusing. In this case 'var obj = {}' you are
// creating object and curly brackets delimit object definition.
// But in this case 'var obj2 = function() {}' you are creating function
// and curly brackets represents 'code block', not object literal.
// But ... function is object also...

var myFunction = function() {};
console.log(myFunction instanceof Object);

// And while this 'var obj = function(){para: 1}' is valid but meaningless 
// code, this 'var obj = function(){this.para: 1}' is as valid as 
// well as frequently used expression to create ... object. But object in 
// another sense... Its really confusing.

但第一个表达式,称为“对象文字表达式”,是创建对象的首选且安全的方式。因为一些恶意代码可以覆盖对象行为。因此,如果您将对象创建为 new Object(),则可以创建一些意想不到的东西。但是对象字面量表达式不能被覆盖。

【讨论】:

  • 啊,如果您将对象声明为 var obj = function(){para: 1},这将不起作用?
  • 对不起,我的意思是错误的;原文:var obj = {para : 1};或 var obj = function();然后创建一个新的 obj: var newObj = new obj({para: 1)};?我说的是最后一个可以通过这种方式更改参数的具体参数,它是第一个 obj 类型还是第二个是函数?
  • 想象一下这段代码'var a = 10;变量 a = 20;控制台,日志(a)'。控制台日志返回 20。因为在第二步中您刚刚重新定义了变量 a。所以,当然你的 newObj 将是第二种类型(函数)的对象,因为在前面的语句中你只是重新定义了变量 obj。
猜你喜欢
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多