myFunc.prototype与新的myFunc()。prototype之间的区别

时间:2018-12-24 05:32:12

标签: javascript

function myFunction() {};
myFunction.prototype.foo = "bar";

var myFuncInstance = new myFunction();

console.log('myFunction.foo:   '        + myFunction.foo); // Prints undefined
console.log('myFuncInstance.foo:   '    + myFuncInstance.foo); // Prints bar

为什么myFunction.foo在这里打印undefined?我已经将foo属性设置为myFunction.prototype.foo = "bar"

4 个答案:

答案 0 :(得分:0)

在这种情况下,myFunc不是对象,它表示对象的 class 。这意味着您可以使用new关键字来创建与该类的prototype具有相同属性的对象。这并不意味着您可以在函数本身上获得一系列新的属性。

按照您的示例,这将起作用:

function myFunction() {};
myFunction.prototype.foo = "bar";

var myFuncInstance = new myFunction();

console.log('myFunction.prototype.foo: '  + myFunction.prototype.foo);
console.log('myFuncInstance.foo: '        + myFuncInstance.foo);

答案 1 :(得分:0)

当您在对象的prototype中声明某个变量时,您会将值附加到该对象的任何实例,因此定义在prototype中的值将可以通过实例访问,因此在调用时myFunction.foo尝试将.foo变量作为静态变量调用,这是因为myFunction是构造函数,而不是该构造函数的实例,因此当您调用myFuncInstance.foo myFuncInstance是实例时已经存在,因此您可以访问.foo变量,因为它是在其“原型”中定义的。

因此,您何时真正需要访问此myFunction.foo,您应该将其定义为

function myFunction() {};
myFunction.foo = 'static bar'; // it can be accessed without instance

因此,当您致电myFunctionInstance.foo时,应将其定义为

function myFunction() {};
myFunction.prototype.foo = 'instance bar'; // it can be accessed with instance
var myFunctionInstance = new myFunction();
myFunctionInstance.foo; // will print 'instance bar'

答案 2 :(得分:0)

我们都知道,JavaScript 对象 继承 属性方法来自原型 >。

在第二个log中,您有一个适当的实例( Prototype Inheritance );在第一个日志中,您正在访问function property,而没有任何实例(直接使用函数名)。

您将需要实例(myFuncInstance)来访问属性,而不是function本身。

答案 3 :(得分:0)

使用FROM nvidia/cuda:9.0-cudnn7-runtime-centos7 ARG TF_VERSION=1.9.0 RUN yum install -y \ yum-plugin-ovl \ libgomp \ ca-certificates \ zip \ unzip \ curl \ && \ yum clean all WORKDIR /usr/ RUN curl -sSL -o /usr/nccl_2.2.13-1-cuda9.0_x86_64.tgz http://some-of-my-net-disk/tensorflow-serving/lib/nccl_2.2.13-1-cuda9.0_x86_64.tgz && \ # Change your way to get nccl library here tar -xvf nccl_2.2.13-1-cuda9.0_x86_64.tgz &&\ rm -f nccl_2.2.13-1-cuda9.0_x86_64.tgz ENV LD_LIBRARY_PATH /usr/nccl_2.2.13-1+cuda9.0_x86_64/lib/:${LD_LIBRARY_PATH} # Change your way to get tensorflow_model_server here WORKDIR /serving RUN curl -sSL -o /usr/local/bin/tensorflow_model_server http://some-of-my-net-disk/tensorflow-serving/bin/tf-serving-${TF_VERSION}/tensorflow_model_server_gpu-centos &&\ chmod u+x /usr/local/bin/tensorflow_model_server 获取一个对象的属性时,每个对象都有一个原型。 首先,它将找到自身的属性,如果没有获得目标属性,它将找到其原型的属性,如果仍然没有获得目标属性,它将继续找到其原型的属性的属性。这些之后,这种情况就变得容易了。

使用.后,您将获得一个实例new,而使用myFuncInstance时,由于本身没有名为myFuncInstance.foo的属性,它将获得属性{{ 1}}来自其构造函数foo的原型。

但是,当使用foo时,myFunction还没有属性调用myFunction.foo,它将找到其原型myFunction,也找不到{{1 }},因此找到foo的原型Function.prototype,它仍然找不到,所以找到foo的原型Function.prototype,所有原型链都找不到找到Object.prototype,因此是Object.prototype

相关问题