변환하는 방법"object"함수로서 JavaScript?
-
02-07-2019 - |
문제
JavaScript 할 수 있는 기능으로 처리하는 개체는 경우 첫 번째 정의한 변수로 기능할 수 있습 그 후 속성을 추가하는 기능입니다.당신은 어떻게 반대로,추가 기능을"object"?
이동:
var foo = function() { return 1; };
foo.baz = "qqqq";
이 시점에서, foo()
함수를 호출하여,그리고 foo.baz
값이"qqqq".
그러나,당신이 할 경우 호텔 할당 부분은 첫째,당신은 어떻게 할당하는 기능을 변?
var bar = { baz: "qqqq" };
나는 지금 무엇을 할 수 있을 정렬한 bar.baz
하는 값이"qqqq" 고 bar()
함수를 호출?
해결책
그것은 혼동하기 쉽지만,여기할 수 없습니다(쉽게나 분명히거나 내가 알기로)당신이 무엇을 원합니다.희망이 도움이 될 것입니다 분명하는 것입니다.
첫째,모든 개체에서 Javascript 에서 상속되는 개체 개체입니다.
//these do the same thing
var foo = new Object();
var bar = {};
둘째,기능 가 체에서 Javascript.특히,그들은 함수 개체입니다.함수 개체로부터 상속되체 개체입니다.체크 아웃 기능성자
var foo = new Function();
var bar = function(){};
function baz(){};
면 변수를 선언할을 수"Object"할 수 없습니다(쉽게나 분명히 또는 멀리로 나도 알아요)그것을 변환하는 함수 개체입니다.당신이 필요할 것을 선언한 새로운 객체의 형식 기능(기능으로 생성자를 지정하여 변수 익명의 기능 등) 과 복사본을 어떤 특성을의 방법에서 당신의 오래된 개체입니다.
마지막으로 예측 가능한 질문에 한 번도 뭔가로 선언된 함수할 수 없습니다(지금까지 내가 알고)변경 functionBody/소스입니다.
다른 팁
가 나타나지 않는 표준이 그것을 할 수있는 방법이지만,이 작품이다.
왜 그러나,질문입니다.
function functionize( obj , func )
{
out = func;
for( i in obj ){ out[i] = obj[i]; } ;
return out;
}
x = { a: 1, b: 2 };
x = functionize( x , function(){ return "hello world"; } );
x() ==> "hello world"
이 단순히 다른 어떤 방법으로 이것을 달성하기 위하여, 일
x={}
x()
을 반환합니다"오류".기 때문에"x"는"object"그리고 당신은 그것을 변경할 수 없습니다.그에 대한으로 합리적인 노력을 할
x = 1
x[50] = 5
print x[50]
그것은 작동하지 않습니다.1 정수입니다.정수 없는 편안 방법입니다.당신이 그것을 할 수 없습니다.
체 종류는 기능과 개체 자체가 기능을 인스턴스화.
javascript:alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String].join('\n\n'))
표시(FireFox):
function Array() {
[native code]
}
function Boolean() {
[native code]
}
function Date() {
[native code]
}
function Function() {
[native code]
}
function Number() {
[native code]
}
function Object() {
[native code]
}
function RegExp() {
[native code]
}
function String() {
[native code]
}
특히,주 함수 개체 function Function() { [native code] }
, 로 정의 재발 관련(재귀한 정의를 사용하여 자).
또한,주 답 124402#124402 불완전한 1[50]=5
.이것은 속성 값을 할당할 수는 객체에 유효 Javascript.관찰,
javascript:
alert([ [].prop="a", true.sna="fu", (new Date()).tar="fu",
function(){}.fu="bar", 123[40]=4, {}.forty=2,
/(?:)/.forty2="life", "abc".def="ghi" ].join("\t"))
표시
a fu fu bar 4 2 life ghi
해석하고 실행하는 올바르게 따라 자바 스크립트의"규칙".
물론 항상 주름 및 매니페스트 =
.체가 종종"단락은"그 값을 대신에 풀 본격적인 엔티티에 할당되는 경우는 변수입니다.이 문제는 부울체고 부울 값입니다.
명시적 개체 식별이 이 문제를 해결합니다.
javascript: x=new Number(1); x[50]=5; alert(x[50]);
"과부는"매우 합법적인 Javascript 운동하고 명시적으로 승인된 메커니즘 prototyping
하지만 코드를 난독될 수 있는 위험이 있습니다.
최종 참고:
javascript: alert( 123 . x = "not" );
javascript: alert( (123). x = "Yes!" ); /* ()'s elevate to full object status */
사용 일시적 변수:
var xxx = function()...
다음 사본을 모든 속성이 원래부터 개체:
for (var p in bar) { xxx[p] = bar[p]; }
마지막으로 할당하는 새로운 기능과 구성하여 원래의 변:
bar = xxx;
var A = function(foo) {
var B = function() {
return A.prototype.constructor.apply(B, arguments);
};
B.prototype = A.prototype;
return B;
};
JavaScript 할 수 있는 기능을 으로 처리되는 개체--추가할 수 있습니다 제공하는 기능입니다.당신은 어떻게 반대로,추가 기능 object?
당신이 나타납을 혼동된다.기능,자바 스크립트에서 가 체입니다.고 변수 가 변수.당신이 예상하지 않을 것이 작동:
var three = 3;
three = 4;
assert(three === 3);
...그래서 당신은 왜 기대하는 할당 함수의 변수를 어떻게든지 이전 값?아마도 몇 가지 주석을 명확히 할 것이다 일들이 당신을 위해:
// assigns an anonymous function to the variable "foo"
var foo = function() { return 1; };
// assigns a string to the property "baz" on the object
// referenced by "foo" (which, in this case, happens to be a function)
foo.baz = "qqqq";
NB:게시물 작성의 스타일에서 내가 어떻게 해결된 문제입니다.나는 100%확실히 그것은에서 사용할 수 있는 OP 의 경우입니다.
이 게시물을 찾고 있는 동안에 대한 방법 개체를 변환하는 서버에서 작성되어 배달하여 클라이언트에 JSON/ajax.
는 효과적으로 나에게 왼쪽에서 동일한 상황으로 협동체가 되어야겠다는 생각이 들었지요 변환로 기능할 수 있도록 인스턴스를 만들에 그것의 클라이언트입니다.
결국 나는 이것은 작업(지금까지도):
var parentObj = {}
parentObj.createFunc = function (model)
{
// allow it to be instantiated
parentObj[model._type] = function()
{
return (function (model)
{
// jQuery used to clone the model
var that = $.extend(true, null, model);
return that;
})(model);
}
}
다음 사용할 수 있는 다음과 같:
var data = { _type: "Example", foo: "bar" };
parentObject.createFunc(data);
var instance = new parentObject.Example();
내 경우에는 실제로 원하는 기능과 연관된 결과 객체를 인스턴스,또는 전달에서 매개 변수간의 인스턴스화하는니다.
그래서 나의 코드:
var parentObj = {};
// base model contains client only stuff
parentObj.baseModel =
{
parameter1: null,
parameter2: null,
parameterN: null,
func1: function ()
{
return this.parameter2;
},
func2: function (inParams)
{
return this._variable2;
}
}
// create a troop type
parentObj.createModel = function (data)
{
var model = $.extend({}, parentObj.baseModel, data);
// allow it to be instantiated
parentObj[model._type] = function(parameter1, parameter2, parameterN)
{
return (function (model)
{
var that = $.extend(true, null, model);
that.parameter1 = parameter1;
that.parameter2 = parameter2;
that.parameterN = parameterN;
return that;
})(model);
}
}
고 따라서:
// models received from an AJAX call
var models = [
{ _type="Foo", _variable1: "FooVal", _variable2: "FooVal" },
{ _type="Bar", _variable1: "BarVal", _variable2: "BarVal" },
{ _type="FooBar", _variable1: "FooBarVal", _variable2: "FooBarVal" }
];
for(var i = 0; i < models.length; i++)
{
parentObj.createFunc(models[i]);
}
그때 사용할 수 있습니다:
var test1 = new parentObj.Foo(1,2,3);
var test2 = new parentObj.Bar("a","b","c");
var test3 = new parentObj.FooBar("x","y","z");
// test1.parameter1 == 1
// test1._variable1 == "FooVal"
// test1.func1() == 2
// test2.parameter2 == "a"
// test2._variable2 == "BarVal"
// test2.func2() == "BarVal"
// etc
var bar = {
baz: "qqqq",
runFunc: function() {
return 1;
}
};
alert(bar.baz); // should produce qqqq
alert(bar.runFunc()); // should produce 1
나는 생각을 찾고 계신다.
작성할 수도 있습니다 다음과 같다:
function Bar() {
this.baz = "qqqq";
this.runFunc = function() {
return 1;
}
}
nBar = new Bar();
alert(nBar.baz); // should produce qqqq
alert(nBar.runFunc()); // should produce 1