Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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中,为什么在构造函数上设置prototype会更改其实例上的.constructor值?_Javascript - Fatal编程技术网

在Javascript中,为什么在构造函数上设置prototype会更改其实例上的.constructor值?

在Javascript中,为什么在构造函数上设置prototype会更改其实例上的.constructor值?,javascript,Javascript,上面的控制台日志 function Human(){ this.job = 'code' } //Human.prototype = {feeds: 'Pizza'}; var developer = new Human(); console.log(developer.constructor); function Human() { this.job = 'code'; } 当我取消注释行Human.prototype={feed:'Pizza'}it控制台日志 function

上面的控制台日志

function Human(){
  this.job = 'code'
}

//Human.prototype = {feeds: 'Pizza'};

var developer = new Human();

console.log(developer.constructor);
function Human() {
this.job = 'code';
}
当我取消注释行
Human.prototype={feed:'Pizza'}it控制台日志

function Human(){
  this.job = 'code'
}

//Human.prototype = {feeds: 'Pizza'};

var developer = new Human();

console.log(developer.constructor);
function Human() {
this.job = 'code';
}
为什么在构造函数上设置原型会影响谁是构造函数创建的对象的构造函数

另一个例子:

function Object() {
  [native code]
}
有注释的时候,它说构造器是人类,没有注释的时候,它说活生生的。当在原型上找到有效的东西时,为什么构造函数会进一步遍历

我想在这上面再加一层

function LivingBeing() {
  breathes: 'air';
}

function Human(){
  feeds: 'Pizza';
}

//Human.prototype = new LivingBeing();

var developer = new Human();
console.log(developer.constructor);

现在它说开发者的构造器正在改变。我能说构造器在原型链中尽可能远吗?

developer
没有自己的名为
constructor
的属性,因此当您要求它时,它会在原型链中查找。因为原型是一个普通对象,所以它的构造函数是默认的对象构造函数
Object()

当您声明一个新函数(如
function Human()
)时,JS会创建一个隐式对象,并填充
prototype
constructor
字段,如下所示:

function AThing(){
  this.say = function(){return 'I am thing';};
}

function LivingBeing() {
  breathes: 'air';
}

LivingBeing.prototype = new AThing();

function Human(){
  feeds: 'Pizza';
}

Human.prototype = new LivingBeing();

var developer = new Human();
console.log(developer.constructor);
现在,当您编写
dev=new Human
时,
dev
的内部
\uuuu proto\uu
属性设置为
X
,并且
dev.constructor
解析为
X.constructor
,即
Human

当您取消注释“pizza”行时,代码将变为以下内容:

X = {}
Human.prototype = X
X.constructor = Human
什么是构造函数? 返回对创建实例的 原型。请注意,此属性的值是对 函数本身,而不是包含函数名称的字符串。这个 值对于基本值(如1、true和 “测试”

第一种情况:
developer
的构造函数是
函数Human(){this.job=“code”}

第二种情况: 因为您正在将原型重写为对象,所以现在开发人员是
object{}
的实例


控制台显示所有本机全局对象,这些对象在javascript本身的实现中预定义为
[本机代码]
。也就是说,他们没有透露实现。

是的,但开发人员仍然是使用相同的人工构造函数创建的。是的,但当人工原型发生变化时,对象本身也发生了变化。你是说函数objectexact与抱歉的重复,我在发布时无法发现。