Javascript 未定义为对象的句柄

Javascript 未定义为对象的句柄,javascript,object,undefined,declaration,new-operator,Javascript,Object,Undefined,Declaration,New Operator,是否有一种技术/框架,在将新对象作为对象处理时,将其创建并存储到未定义的变量中 F.e.写作 some.thing = 7; 给出一个错误,描述无法设置未定义的(某些)属性 所以现在,我们必须回去写 some = {}; some.thing = 7; 这对我来说几乎是不必要的,因为很明显,我想用一些作为对象 这样会很舒服: hospitals.sectors.doctors = []; hospitals.sectors.doctors[ 0 ].age = 32; 这看起来比以前更有

是否有一种技术/框架,在将新对象作为对象处理时,将其创建并存储到未定义的变量中

F.e.写作

some.thing = 7;
给出一个错误,描述无法设置未定义的(某些)属性

所以现在,我们必须回去写

some = {};
some.thing = 7;
这对我来说几乎是不必要的,因为很明显,我想用一些作为对象


这样会很舒服:

hospitals.sectors.doctors = [];
hospitals.sectors.doctors[ 0 ].age = 32;
这看起来比以前更有效、更简单

hospitals = {};
hospitals.sectors = {};
hospitals.sectors.doctors = [];
hospitals.sectors.doctors[ 0 ] = {};
hospitals.sectors.doctors[ 0 ].age = 32;

您可以编写自己的处理程序来完成此工作

function createObjectProperty(objNameString, objPropertyString, objValueString) {
window[objNameString] = {};
window[objNameString][objPropertyString] = objValueString;
return window[objNameString];}

var test = createObjectProperty("some", "thing", 7);
alert(test.thing);
这个电话看起来像:

createObjectProperty("some", "thing", 7);
它会提醒“7”。如果新对象存在,您也可以在创建新对象之前进行检查。我将迭代对象并收集所有属性,检查是否存在重复项,如果您需要这样的功能,请附加我的新属性+值。否则,新对象将覆盖旧对象。希望这就是你正在寻找的

工作小提琴(更新):


如果您试图将
7
分配给
某些事物
某些事物
应该事先声明而不是,请使用Cory的建议
var some={thing:7}


如果您试图将
7
分配给
某些对象,那么
某些
可能已经声明/定义了(或者即使声明了,也可能设置为
未定义的
),请使用

或者(一个更可读的解决方案,尽管不是一行)

我的解决方案的一个警告是,如果没有提前声明,您可能会在
某些
上得到不需要的范围。一个未定义但仍声明的示例(因此范围将是预期范围):

编辑:创建了一个名称空间解决方案,如anddoutoi所建议的。 第一个用法示例(
hospitals
)使用第三个参数的可选性质,默认为“undefined”

第二个示例(
hospitals2
)未定义传递

第三个示例(
hospitals3
)传递另一个对象(我碰巧以内联方式创建了它)

对于您(OP)提供的示例,我的
hospitals
示例最接近精确匹配。除了使用规范名称字符串+函数之外,我不知道有什么方法可以自动神奇地创建对象层次结构

function create(canonicalPropertyName, value, root) {
    root = (root || {});
    var names = canonicalPropertyName.split(".");
    var current = root;

    for (var i = 0; i < names.length; i++) {
        /* Ensure the property exists */
        current[names[i]] = (current[names[i]] || (i < names.length - 1 ? {} : []));

        /* We're recursing down the object tree */
        current = current[names[i]];
    }

    return root;
}

var hospitals = create("sectors.doctors", []);
hospitals.sectors.doctors[ 0 ] = {};
hospitals.sectors.doctors[ 0 ].age = 32;
console.log(hospitals);

var hospitals2 = create("sectors.doctors", [], undefined);
hospitals2.sectors.doctors[ 0 ] = {};
hospitals2.sectors.doctors[ 0 ].age = 32;
console.log(hospitals2);

var hospitals3 = create("sectors.doctors", [], { name: "City Hospital" });
hospitals3.sectors.doctors[ 0 ] = {};
hospitals3.sectors.doctors[ 0 ].age = 32;
console.log(hospitals3);
函数创建(canonicalPropertyName、值、根){
根=(根|{});
变量名称=canonicalPropertyName.split(“.”);
无功电流=根;
对于(var i=0;i
许多框架都有一个
名称空间()
方法/函数,可以帮助您实现所需

例如:

Ext.ns('hospitals.sectors.doctors') = [];
var doctors = Ext.ns('hospitals.sectors.doctors');
doctors[0] = {
    age : 32
};

我自己也不喜欢这种模式,因为它添加了不必要的依赖项和工作?我想避免这种结构,因为在更深层次(多维)的对象中,它是相当混乱的。因为
东西
某些
变量的属性,那么定义对象变量然后分配属性肯定是有意义的——据我所知,这就是所有其他语言的工作方式。据我所知,在为所有未定义的对象分配属性时,没有一种方法可以自动处理异常。这是正确的,它非常有意义,但是,在复杂的oop web应用程序中以这种方式声明对象还是比较舒服的。我会在我的答案后面加上一个例子,说明在实践中什么地方比较合适。是的,我认为一个例子会帮助我更多地了解你来自哪里。但是来自面向对象语言的背景,在指定属性之前定义对象是第二天性。事实上,JS的类型非常松散,因为它不需要在赋值之前定义属性。
function assignThing(some) {
    (some = (some || {})).thing = 7; /* one liner solution */
    return some;
}

var foo = assignThing(); /* the parameter 'some' is undefined, but declared */

var bar = assignThing({}); /* the parameter 'some' is defined
                            * (though empty) and declared */

(baz = (baz || {})).thing = 7; /* Unless you have this declared
                                        * elsewhere this *should* be the
                                        * global scope */

var foobar; /* declared, not defined */
(foobar = (foobar  || {})).thing = 7; /* now defined */
function create(canonicalPropertyName, value, root) {
    root = (root || {});
    var names = canonicalPropertyName.split(".");
    var current = root;

    for (var i = 0; i < names.length; i++) {
        /* Ensure the property exists */
        current[names[i]] = (current[names[i]] || (i < names.length - 1 ? {} : []));

        /* We're recursing down the object tree */
        current = current[names[i]];
    }

    return root;
}

var hospitals = create("sectors.doctors", []);
hospitals.sectors.doctors[ 0 ] = {};
hospitals.sectors.doctors[ 0 ].age = 32;
console.log(hospitals);

var hospitals2 = create("sectors.doctors", [], undefined);
hospitals2.sectors.doctors[ 0 ] = {};
hospitals2.sectors.doctors[ 0 ].age = 32;
console.log(hospitals2);

var hospitals3 = create("sectors.doctors", [], { name: "City Hospital" });
hospitals3.sectors.doctors[ 0 ] = {};
hospitals3.sectors.doctors[ 0 ].age = 32;
console.log(hospitals3);
Ext.ns('hospitals.sectors.doctors') = [];
var doctors = Ext.ns('hospitals.sectors.doctors');
doctors[0] = {
    age : 32
};