1
votes

Pourquoi le constructeur Javascript ne revient pas

J'ai un problème. Lorsque j'instance à partir d'un objet, il ne renvoie pas la valeur du constructeur. .................................................. .................................................. .................................................. .......... .................................................. .................................................. .................................................. ..........

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>

<script src="sampleObject1.js"></script>
<script src="sampleObject2.js"></script>
</body>
</html>
//Main Branch
var Creatures = function () {
    function Creatures(name,alive) {
        this.name = name;
        this.alive = alive;
    }
    function Creatuers(name,alive,sleep) {
        this.name = name;
        this.alive = alive;
        this.sleep = sleep;
    }
};

var Beast = function () {
    function breathe() {
        return true;
    }
    this.__proto__ = new Creatures;
};
var Mammals = function () {
    this.numberOfBeads = "i am numberOfBeads from Mammals";
    this.__proto__ = new Beast;
};


//Mammals Branch
var Humans = function () {
    function thinking(){
        return true;
    }
    this.love = "i am love from humans";
    this.__proto__ = new Mammals;
};
var Animals = function () {
    this.instinct = "i am Animals from Animals";
    this.__proto__ = new Mammals;
};
var Plants = function () {
    this.color = "i am color from Plants";
    function grown() {
        return true;
    }
    this.__proto__ = new Creatures;
};
var Trees = function () {
    this.height = "i am height from Trees";
    this.__proto__ = new Plants;
};
var Flowers = function () {
    this.smell = "i am smell from Flowers";
    this.__proto__ = new Plants;
};
var Grasses = function () {
    this.color = "i am color from Grasses";
    this.__proto__ = new Plants;
};
var obj2 = new Creatures("ali",true);
alert(obj2.name);


1 commentaires

Ce que vous essayez de faire est obscur. Pouvez-vous expliquer votre intention (et réduire votre code à un exemple reproductible minimal )?


3 Réponses :


0
votes

Je peux confirmer comme @Denys Seguret l'a dit, certaines choses semblent plutôt obscures ...

Quoi qu'il en soit, vous êtes indéfini car un constructeur de fonction renvoie un objet avec les propriétés que vous attachez dans ce constructeur de fonction.

Dans votre cas, votre fonction est:

function Creatures(name,alive,sleep) {
  this.name = name;
  this.alive = alive;
  this.sleep = sleep;
}

var obj2 = new Creatures("ali", true);
alert(obj2.name);

Il s'agit d'une expression de fonction qui a à l'intérieur de sa portée deux fonctions avec le même nom (la seconde remplacera la première , bien que le premier soit inutile).

Comme vous pouvez le voir, vous ne définissez aucun type de propriété à l'objet qui en sera implicitement renvoyé.

Je fais votre exemple pour travailler simplement en le remplaçant par la deuxième déclaration de fonction:

var Creatures = function () {
    function Creatures(name,alive) {
        this.name = name;
        this.alive = alive;
    }
    function Creatures(name,alive,sleep) {
        this.name = name;
        this.alive = alive;
        this.sleep = sleep;
    }
};

Ceci crée une alerte qui dit "ali".


0 commentaires

0
votes

vous n'avez aucune instruction return dans la fonction

var Creatures = function (...params) {
    function Creatures1(name,alive) {
        this.name = name;
        this.alive = alive;
    }
    function Creatures2(name,alive,sleep) {
        this.name = name;
        this.alive = alive;
        this.sleep = sleep;
    }
    return params.length === 2 ? new Creatures1(...params) : new Creatures2(...params);
};

var obj2 = Creatures("ali",true);
alert(obj2.name);

ce que vous essayez probablement de faire est de déléguer l'instanciation de l'objet en choisissant le constructeur approprié en fonction des paramètres (et peut-être une logique métier). attention qu'il n'y a pas de surcharge de méthode en javascript donc vous devez utiliser un nom différent pour les fonctions internes.

var Creatures = function () {
    function Creatures(name,alive) {
        this.name = name;
        this.alive = alive;
    }
    function Creatuers(name,alive,sleep) {
        this.name = name;
        this.alive = alive;
        this.sleep = sleep;
    }
};


0 commentaires

0
votes

Si vous faites référence à var obj2 = new Creatures ("ali", true); cela renvoie une instance! Il ne renvoie pas de nouvelle instance de Creatures avec les propriétés name et alive car ce ne sont pas des paramètres de votre fonction constructeur, ni des propriétés définies dans votre fonction constructeur ( top -level one ):

var Creatures = function () {
    ...
};

ce que vous semblez essayer de faire est de créer un constructeur surchargé? La surcharge de fonctions n'est pas prise en charge en javascript!


0 commentaires