Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.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,这有关系吗?_Javascript - Fatal编程技术网

如果我的对象返回错误的构造函数JavaScript,这有关系吗?

如果我的对象返回错误的构造函数JavaScript,这有关系吗?,javascript,Javascript,好吧,就看这个问题,这似乎很重要,但让我们看看我做的一个测试 所以我创建了3个构造函数。我做了一辆普通的车,然后是马自达,然后是MX8。它们都是基于JSFIDLE中的代码继承的。这是我所做的一个外壳,更多细节可以在 顺便说一句,我是Object.create的超级粉丝,它不需要任何保姆 var Car = function () { //code here } var Mazda = function (type) { this.type = type; //more

好吧,就看这个问题,这似乎很重要,但让我们看看我做的一个测试

所以我创建了3个构造函数。我做了一辆普通的车,然后是马自达,然后是MX8。它们都是基于JSFIDLE中的代码继承的。这是我所做的一个外壳,更多细节可以在

顺便说一句,我是Object.create的超级粉丝,它不需要任何保姆

var Car = function () {
    //code here
}

var Mazda = function (type) {
    this.type = type;
    //more code here including a simple method test    
}

var MX8 = function () {
   //more code here
}

Mazda.prototype = new Car();
MX8.prototype = new Mazda("MX8");

var z = new MX8();

//refer to my JSFiddle
z.interior;               // got correct interior
z.type;                   // got correct type ie model
z.warrantyInfo();         // method was correctly inherited
z.speed;                  // got correct speed
z.constructor === MX8;    // false (unless I specify the constructor in the code of which is commented out in my JSFiddle)

简短回答
您需要显式地设置构造函数

function Base() {}
function Derived() {}

// old prototype object is gone, including constructor property
// it will get however all the properties attached by Base constructor
Derived.prototype = new Base(); 

Derived.prototype.constructor = Derived;
如果我的对象返回了错误的构造函数,这有关系吗

好吧,这取决于你是否在使用那个财产。我认为保持正确的构造函数是一个很好的实践

可能的用例:

function getType (target) {
  // name is empty unless you use the function declaration syntax 
  // (read-only property) 
  return target.constructor.name; 
}

getType(new Derived()) // "Derived"
getType(new Base()) // "Base"
旁注
在JS中有更好的实现继承的方法。 我最喜欢的模式如下:

function Base (x) { this.x = x; }

function Derived (x, y) { Base.call(this, x); this.y = y; }

// creates an empty object whose internal "[[Prototype]]" property 
// points to Base.prototype
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.constructor = Derived;
对象后面的idea.create
基于:

function create (proto) {
  function f () {}
  f.prototype = proto;
  return new f();
}
实际的函数
Object.create
更好,因为您可以将
null
作为原型传递,而使用上述代码则不起作用。
无论如何,你应该看看这个优秀的播放列表:。

你能澄清一下你真正的问题是什么吗?当然,我想如果事情是正确继承的或者看起来是这样的,为什么会有关系?有很多博客文章、网站和Youtube视频解释Javascript的基本原理。更不用说我同意“thefourtheye”——你问的问题还不清楚。标题已经没有意义了,对象不会返回任何内容!它们是对象,被动存储空间。
构造函数
对JS本身没有意义,如果你是这个意思的话。相关:-还有更多。哦,我同意,我会自己维护构造函数,因为正如你所说的“良好实践”。我只是一直在看视频和博客,谈论对象如何不能用错误的构造函数正确继承,而我似乎继承得很好。这就是为什么我不认为这是一个坏问题,但也许是。谢谢你的资源。是的,像我之前的其他人一样,我正在摆脱“新”这个词和传统的继承方式。然而,正如你所知道的,有些东西是在野外,所以我仍然有机会了解这些东西。