Javascript 我正在向object.defineProperties传递对象吗?

Javascript 我正在向object.defineProperties传递对象吗?,javascript,Javascript,我正在学习javascript,希望能帮助理解代码片段 根据定义,第一个参数是对象。MyObject构造函数是声明还是对象。使用构造函数,我希望调用new,使其成为一个对象 这就是让我困惑的地方。或者,当我在Javascript中读到函数是对象时,我是否将其视为对象,并且this属性是所有StaticProp和InstanceProp添加到的位置 var _prototypeProperties = function (child, staticProps, instanceProps) {

我正在学习javascript,希望能帮助理解代码片段

根据定义,第一个参数是对象。MyObject构造函数是声明还是对象。使用构造函数,我希望调用new,使其成为一个对象

这就是让我困惑的地方。或者,当我在Javascript中读到函数是对象时,我是否将其视为对象,并且this属性是所有StaticProp和InstanceProp添加到的位置

var _prototypeProperties = function (child, staticProps, instanceProps) {
   if (staticProps){ 
       Object.defineProperties(child, staticProps)
   };
    if (instanceProps) { 
     Object.defineProperties(child.prototype, instanceProps);
   }
  };

function myFunction() {
    function MyObjectConstructor(element) {
      this.element = element;
      this.initialized = false;
    }

  _prototypeProperties(MyObjectConstructor, {...}, {...});
}
是的,(构造函数)函数在javascript中也是对象,您可以直接向它们添加属性


示例代码段中的
\u prototypeProperties
函数将
staticProperties
放在构造函数上,这样就可以作为
MyObjectConstructor.myStaticProperty
访问它们。它还将
instanceProps
(更好的方法是:“类属性”、“原型属性”)放在
MyObjectConstructor.prototype
对象上,实例从中继承它们:
(新的MyObjectConstructor.myPrototypeProperty
)。最后,您的
MyObjectConstructor
确实在实例上放置了“real”(own)属性,特别是
(新的MyObjectConstructor).element
.initialized
第一个:
函数
是javascript中的
第一个类型对象。这意味着您可以将功能作为价值交付。例如:

function test(){

    return function(){
        console.log('function');
    }
}

test()();
您将函数作为返回对象返回,函数可以赋值,函数可以是另一种值

var test = function(i) {
    // body...
    return i;
}

test('123');
字符串“test”是指匿名函数,您可以理解将函数传输到字符串

第二:如果使用
new
通过函数创建实例,此函数将被称为
构造函数
,通常用于初始化参数,实例将从构造函数中获取构造函数自己的属性或方法以及原型的属性或方法

第三:实例的属性“
\uuuuu proto\uuuu
”是指构造函数的原型对象。这就是为什么实例可以从构造函数中使用原型的属性或方法

第四:如果您通过
new
创建实例,则
this
将引用实例对象!以便该实例可以使用该属性和方法

从您的代码:

var _prototypeProperties = function (child, staticProps, instanceProps) {
   if (staticProps){ 
       Object.defineProperties(child, staticProps)
   };
   // the properties from the own construction function  , like this :
   //  this.element = element;
   //  this.initialized = false;


    if (instanceProps) { 
     Object.defineProperties(child.prototype, instanceProps);
   }
  };

  // the properties from the construction function's prototype object . like this :
  //   MyObjectConstructor.prototype.name = 'somebody';
  //   MyObjectConstructor.prototype.getName = function(){
  //        return this.name;
  //   }

在JavaScript中,一旦定义,结果函数的作用相同:

function Hat() { }
var Hat = function() { }
传统上,第一种方法用于创建对象(通常使用
new
),第二种方法用作常规方法

new
操作符,在函数前面出现时会有点奇怪。使用新的
操作员将:

  • 创建一个新对象“it”
  • 将被调用的函数设置为“它的原型”
  • 将“it”绑定到函数中的
  • 用“it”覆盖函数的返回值。这将覆盖
    未定义的
    的显式返回和隐式返回
例如:

// first define Hat function
function Hat() { this.color = 'red' }

// calling with `new` implicitly returns a new object bound to the function
new Hat()
// > Hat { color: "red" }

// invoking without `new` implicitly returns `unefined`,
// but `this` points to Hat's parent object.
// If running in the browser, Hat's parent object would be `window`
// so now Window.color is set to "red"
Hat()
//> undefined
Window.color
//> "red"
小心使用
new
,因为将返回新对象,而不是任何显式返回

var color = function() { return "blue" }
color()
//> "blue"
new color()
//> color {}
JavaScript本质上是原型。
new
操作符既不反映原型继承,也不反映经典继承。我尽可能避免使用它,尽管许多流行的图书馆都使用它

我建议阅读Crockford对JavaScript原型继承的解释:

它很简洁,但如果你理解他的10行演示代码,你会很好


使用
绑定
调用
应用
,以及不同的作用域上下文。在理解了作用域和原型性质之后,剩下的只是语法。

No,构造函数本身就是一个对象(try
FooConstructor.a=1
)“第一个类型对象”-这意味着什么?例如:函数test(){return function(){console.log('function');}}test test();您可以返回
函数
作为返回
对象
函数
可以在javascriptYes中作为对象传递,函数就是对象;虽然“作为对象的功能”没有多大意义。你的语句“函数是javascript中的第一个类型对象”与我的英语语法不符。对不起,实际上我是一个中国人,我的英语不够好,我编辑了答案,也许你可以从我的答案中得到它……我想@qianjiahao的意思是“第一类对象”,谢谢,@Bergi,edited。“很难判断答案的正确深度,特别是对一种语言的新手来说。”马修。谢谢你提供的信息。你的“这个”例子很有道理。谢谢你,Bergi,你和其他人的回答很清楚。好的,函数是第一类对象。那么“this”值是多少?函数是否有自己的“this”值?否,
this
是由函数调用方设置的特殊标识符(变量?)。如果将函数作为构造函数调用,
将引用新实例;因此,构造函数将创建
.element
.initialized
作为新对象的自身属性。阅读更多关于此的信息,或者您可以查看:。你是说在这个文件之外已经设置了“this”吗?你说的“文件之外”是什么意思<代码>此
通常仅在函数/方法中使用。当它指向调用该方法的对象时,例如,当您调用
obj.method()
时,在
function method(){…
中,
值是
obj
对不起,现在您的意思更清楚了。非常感谢您的帮助。