Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.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 为什么重新指定Object.prototype不起作用?_Javascript_Syntax_Function_Prototype_Object - Fatal编程技术网

Javascript 为什么重新指定Object.prototype不起作用?

Javascript 为什么重新指定Object.prototype不起作用?,javascript,syntax,function,prototype,object,Javascript,Syntax,Function,Prototype,Object,为什么这不起作用 // this one works as I expected, when objSayHello() Object.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')}; // NOT working ! Object.prototype ={objSayHello: function(){alert('Hello,from OBJECT prototype')}}; objSayH

为什么这不起作用

// this one works as I expected, when objSayHello()
Object.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
// NOT working !
Object.prototype ={objSayHello: function(){alert('Hello,from OBJECT prototype')}};

objSayHello();
  • 因为您已经替换了
    对象
    原型,所以您要将
    objSayHello
    方法添加到从
    对象
    下降的任何对象(所有对象)

  • 不要替换
    对象。原型

  • 您可能想要的是:

    someObj.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
    
    然后用以下方式来称呼它:

    someObj.objSayHello();
    
    你似乎想做的是:

    Object.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
    
    但这可能是个坏主意,因为如果处理不正确,它将与迭代器(
    for…in
    )冲突

    Object.prototype.objSayHello = function(to){alert('Hello, ' + to)};
    
  • 因为您已经替换了
    对象
    原型,所以您要将
    objSayHello
    方法添加到从
    对象
    下降的任何对象(所有对象)

  • 不要替换
    对象。原型

  • 您可能想要的是:

    someObj.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
    
    然后用以下方式来称呼它:

    someObj.objSayHello();
    
    你似乎想做的是:

    Object.prototype.objSayHello = function(){alert('Hello,from OBJECT prototype')};
    
    但这可能是个坏主意,因为如果处理不正确,它将与迭代器(
    for…in
    )冲突

    Object.prototype.objSayHello = function(to){alert('Hello, ' + to)};
    
    上面的语句意味着您将
    objSayHello
    函数附加到将要创建的所有实例,因为每个实例都是
    Object
    的子实例,所以附加的事件绑定到所有实例。比如说,

    var newObject = {};
    var anotherNewObject = new Object();
    
    function person(name) {
     this.name = name;
    }
    var newPerson = new Person("Ramiz");
    
    newObject.objSayHello("newObject");
    anotherNewObject.objSayHello("anotherNewObject");
    newPerson.objSayHello(this.name);
    
    然而,另一条语句是不正确的,当您将要放弃所有对象的父对象的
    原型时,它将被完全忽略。如果可以覆盖
    对象
    原型
    ,则所有本机实例功能都将消失。为了避免这样的错误,我认为这是一个被忽略的问题

    上面的语句意味着您将
    objSayHello
    函数附加到将要创建的所有实例,因为每个实例都是
    Object
    的子实例,所以附加的事件绑定到所有实例。比如说,

    var newObject = {};
    var anotherNewObject = new Object();
    
    function person(name) {
     this.name = name;
    }
    var newPerson = new Person("Ramiz");
    
    newObject.objSayHello("newObject");
    anotherNewObject.objSayHello("anotherNewObject");
    newPerson.objSayHello(this.name);
    

    然而,另一条语句是不正确的,当您将要放弃所有对象的父对象的
    原型时,它将被完全忽略。如果可以覆盖
    对象
    原型
    ,则所有本机实例功能都将消失。为了避免这样的错误,我认为这是忽略被覆盖。

    Object.prototype出于某种原因是常量,这意味着只读。

    Object.prototype出于某种原因是常量,这意味着只读。

    Object.prototype实际上不是真正的原型,它只是一个参考。内部[[prototype]]对象用作原型,在某些浏览器中,它可以作为对象的proto属性访问。根据JavaScript变量的工作方式,将Object.prototype分配给另一个对象会更改它的引用,但不会更改内部[[prototype]]对象,因此您会得到一个名为prototype的普通属性,它不说明如何解析对象属性


    那么,当您执行Object.prototype.myFunction()时,为什么这会起作用呢?Object.prototype仍然是内部[[prototype]]的参考,因此使用此功能对其进行扩展没有问题,它与任何其他对象一样工作。

    Object.prototype实际上不是真正的原型,它只是一个参考。内部[[prototype]]对象用作原型,在某些浏览器中,它可以作为对象的proto属性访问。根据JavaScript变量的工作方式,将Object.prototype分配给另一个对象会更改它的引用,但不会更改内部[[prototype]]对象,因此您会得到一个名为prototype的普通属性,它不说明如何解析对象属性


    那么,当您执行Object.prototype.myFunction()时,为什么这会起作用呢?Object.prototype仍然是内部[[prototype]]的引用,因此使用此函数对其进行扩展没有问题,它与任何其他对象一样工作。

    无眼睑是错误的,您只需喜欢对象、数字等。您只能附加新属性

    > Number.prototype
      -> Number
    > Number.prototype = {}  // Reassignment fails
      -> Object
    > Number.prototype
      -> Number
    > Number.prototype.objSayHello = 'hi'  // Appending succeeds
      -> 'hi'
    > n = new Number(); n.objSayHello
      -> 'hi'
    
    如果使用自己的对象,则可以更新或重新指定原型(注意:重新指定原型只会影响新对象,而不会影响现有对象)

    不要更改内部原型这是一件“坏事”,因为它会导致难以发现的副作用。如果需要具有新属性的基本类型,请创建一个原型指向基本对象的新对象:

    NewObject = function() {};
    NewObject.prototype = Object.prototype;
    NewObject.prototype.value = 123;
    

    现在,您有了一个构造函数,它可以创建新的对象,这些对象既继承自己的原型(例如“值”)的属性,也继承对象原型(例如“toString”、“hasOwnProperty”…)。

    这是错误的,您只是喜欢对象、数字等。您只能附加新属性

    > Number.prototype
      -> Number
    > Number.prototype = {}  // Reassignment fails
      -> Object
    > Number.prototype
      -> Number
    > Number.prototype.objSayHello = 'hi'  // Appending succeeds
      -> 'hi'
    > n = new Number(); n.objSayHello
      -> 'hi'
    
    如果使用自己的对象,则可以更新或重新指定原型(注意:重新指定原型只会影响新对象,而不会影响现有对象)

    不要更改内部原型这是一件“坏事”,因为它会导致难以发现的副作用。如果需要具有新属性的基本类型,请创建一个原型指向基本对象的新对象:

    NewObject = function() {};
    NewObject.prototype = Object.prototype;
    NewObject.prototype.value = 123;
    

    现在,您有了一个构造函数,它可以创建新的对象,这些对象既继承自己的原型(例如“value”)的属性,也继承对象原型(例如“toString”、“hasOwnProperty”…)。

    ECMAScript语言规范有以下内容:

    Object.prototype的初始值为%Object.prototype%

    此属性具有属性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false


    您会发现所有其他本机JavaScript构造函数的
    原型
    属性都有相同的“[[Writable]]:false”规范,例如
    函数
    编号
    RegExp
    日期
    ,…等等。

    ECMAScript语言规范有以下内容:

    Object.prototype的初始值