请详细解释javascript中的原型属性和函数构造函数

请详细解释javascript中的原型属性和函数构造函数,javascript,object,constructor,user-defined-functions,prototype-chain,Javascript,Object,Constructor,User Defined Functions,Prototype Chain,我正在读科迪·林德利写的一本名为《Javascript启蒙》的好书。 在涵盖prototype属性的章节中,它讨论了函数实例如何始终被赋予prototype属性,这一点非常容易理解。以下摘录中的粗体文字是我不理解的: 原型是所有Function()实例的标准配置。 所有函数都是从Function()构造函数创建的,即使您没有直接调用Function()构造函数 (例如,var add=新函数('x','y','return x+z');) 而是使用文字符号 (例如,var add=函数(x,y)

我正在读科迪·林德利写的一本名为《Javascript启蒙》的好书。 在涵盖prototype属性的章节中,它讨论了函数实例如何始终被赋予prototype属性,这一点非常容易理解。以下摘录中的粗体文字是我不理解的:

原型是所有Function()实例的标准配置。 所有函数都是从Function()构造函数创建的,即使您没有直接调用Function()构造函数

(例如,var add=新函数('x','y','return x+z');)

而是使用文字符号

(例如,var add=函数(x,y){return x+z};)

创建函数实例时,总是为其提供一个原型属性,,它是一个空对象。 下面,我们定义一个名为myFunction的函数,然后访问prototype属性,即 只是一个空对象

<!DOCTYPE html><html lang="en"><body><script>
var myFunction = function() {};
console.log(myFunction.prototype); // logs object{}
console.log(typeof myFunction.prototype); // logs 'object'
</script></body></html>

var myFunction=function(){};
console.log(myFunction.prototype);//日志对象{}
console.log(typeof myFunction.prototype);//日志“对象”
确保您完全理解prototype属性来自函数() 构造器只有当我们打算将函数用作用户定义的构造函数时 prototype属性已被利用,但这不会改变Function()构造函数 为每个实例提供一个原型属性

以下是我对加粗文本的问题:1。为什么原型对象是空的?我认为prototype应该包含一些属性和方法,用于所有本机对象。2.我完全搞不明白,只有当您打算将该函数用作用户定义的构造函数时,才会使用prototype,这意味着什么。这是否意味着原型链只有在用户定义函数时才可访问

  • prototype属性对象是空的,因为没有为其分配任何内容,但它仍然存在于每个函数中,这就是javascript编写的方式
  • 只有在编写面向对象的javascript时,才能使用prototype属性。下面是一个简单的例子:

    function myFunction() {this.a=1; this.b=2;}
    myFunction.prototype.myMemberFunction = function() {return this.a + this.b;}
    var f = new myFunction();
    
    // Now you can call the member function like this:
    alert(f.myMemberFunction());
    

  • f现在是一个对象,您可以在其中访问所有成员变量、函数等。

    要强制控制台显示原型链树,您可以执行
    console.dir
    而不是
    console.log
    尝试以下操作:
    function f(){};控制台日志(f.bind类型)也可以这样做:
    console.log(Object.getPrototypeOf(f.prototype))
    查看继承的原型。
    .prototype
    属性是构造函数用于实现继承的属性。它最初是空的,因为该语言并不假定您想要继承任何东西(但我不确定它是否为空。我认为它最初指向Object.prototype)。当您想要从某个对象继承时,可以将构造函数的原型指向您想要的对象。