Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:确定对象是否在内存中被复制_Javascript - Fatal编程技术网

Javascript:确定对象是否在内存中被复制

Javascript:确定对象是否在内存中被复制,javascript,Javascript,Javascript问题:我如何确定“ModuleMethodsConstructor”的每个实例是否在内存中复制了“ModulePropertiesConstructor”?我的目标是每个实例使用相同的方法,我不想使用prototype function ModuleMethodsConstructor() { var referenceToInstanceProperties = arguments[0]; var privateMethods = {}; //

Javascript问题:我如何确定“ModuleMethodsConstructor”的每个实例是否在内存中复制了“ModulePropertiesConstructor”?我的目标是每个实例使用相同的方法,我不想使用prototype

function ModuleMethodsConstructor() {

    var referenceToInstanceProperties = arguments[0];

    var privateMethods = {}; // 
    var publicMethods = {};


    publicMethods.setProperty1 = function(){
        referenceToInstanceProperties.property1 = arguments[0];
    };

    publicMethods.getProperty1 = function(){
        console.log(referenceToInstanceProperties.property1);
    };

    privateMethods.privateMethod = function() {
        console.log('privateMethod');   
    };

    return {'privateMethods':privateMethods,'publicMethods':publicMethods};

}; // ModuleMethodsConstructor


function ModulePropertiesConstructor() {

    var properties = {
        'property1' : 'value1', 
    };

    var returned = ModuleMethodsConstructor(properties); 

    var privateMethods = returned.privateMethods;
    var publicMethods = returned.publicMethods;

    return publicMethods;

}; // ModulePropertiesConstructor


var instance1 = ModulePropertiesConstructor();

var instance2 = ModulePropertiesConstructor();

谢谢,Bergi,我按照您的建议使用相等运算符进行了测试。我想我正在尝试装配一种方法来获得闭包构造函数(私有成员)和原型(方法定义加载到内存中一次并在实例之间共享)的优点。我从各种渠道读到,与二人结婚是不可能的。。。在过去,我喜欢闭包,因为我很早就读过Crockford的书。也就是说,也许我会尝试一下原型。。。泰德,谢谢波蒂和罗布

嘿,我刚想到这个:

var l=function(){console.log(参数[0]);}//用于速记控制台日志

//每个对象的3个构造函数用于实现私有成员(闭包)加上每个实例在内存中共享方法定义(如原型)

函数模块PrivateMethodsConstructor(){

};//ModulePrivateMethods构造函数

var modulePrivateMethods=modulePrivateMethods构造函数()

函数模块PublicMethodConstructor(){

};//ModulePublicMethodsConstructor

var modulePublicMethods=ModulePublicMethodsConstructor()

函数模块属性构造函数(){

};//ModuleProperties构造函数

var moduleProperties构造函数args={'modulePrivateMethods':modulePrivateMethods,'modulePublicMethods':modulePublicMethods}

ModuleProperties构造函数args.id='instance1'; var instance1=模块属性构造函数(模块属性构造函数args)

ModuleProperties构造函数args.id='instance2'; var instance2=模块属性构造函数(模块属性构造函数args)

instance1.logID()

instance2.logID()

instance1.logID()


//支持链接?返回对目标被调用方的引用

“我不想使用原型”-为什么不?这是做这项工作的合适工具!“如何确定“ModuleMethodConstructor”的每个实例是否在内存中复制了“ModulePropertiesConstructor”?“-ModuleMethodConstructor不是,但它内部创建的所有函数都是。您可以轻松测试
instance1.getProperty1!==instance2.getProperty1
“我的目标是每个实例使用相同的方法”-当它们是实例特定的闭包时,这是不可能的,就像它们当前一样。请注意,虽然确实会有单独的函数实例,但每个函数的实际代码(几乎可以肯定)由所有副本共享。这似乎与主题无关。关于内存使用的一般问题无法准确回答,因为它依赖于实现。这个问题太宽泛了,无法具体回答。好吧,我已经编辑完了:-)有点复杂,但它符合我的要求
var properties = {};
var privateMethods = {};
var publicMethods = {}; // will become private methods of instance



publicMethods.test = function() {

    l('test');

}; // 

return publicMethods;
var properties = {};
var privateMethods = {};
var publicMethods = {}; // will become public methods of instance



publicMethods.test = function() {

    l('test');  

}; // publicMethods.test

publicMethods.logID = function() {

    // l(this); // this refers to ModulePublicMethodsConstructor 

    l(arguments[0].instanceProperties.id);

}; // publicMethods.logID

return publicMethods;
var properties = {};
properties.id = arguments[0].id;

var privateMethods = {};
var publicMethods = {};
var instancePublicMethods = {};

privateMethods = arguments[0].modulePrivateMethods;

publicMethods = arguments[0].modulePublicMethods;


// each method needs this signature so the methods have access to instance properties
instancePublicMethods.logID = function(){
    publicMethods.logID({'args':arguments[0],'instanceProperties':properties});
}; // 





return instancePublicMethods;