我如何使用对象文字模式代替构造函数

时间:2014-05-29 14:02:22

标签: javascript oop

我正在尝试学习不同的对象声明类型和继承。在这里,我首先使用对象构造函数声明了一个名为parent的对象。然后,引入了另一个对象child,它继承了parent的所有属性。

使用构造函数的父对象是:

function parent(){
  this.parent_last_name="khan";
  this.occupation="business";

}

然后声明一个子对象,并使用

从父对象继承所有属性和方法
child.prototype=new parent();

在同一个例子中,我替换了构造函数类型声明并使用了对象文字类型声明。

var parent={
  name: "khan",
  occupation: "business",
  ask: function(){
    alert("what do you do?");
  },
};

它给了我一个错误,"父母不是构造函数"。它没有打印任何东西。

我的问题是: 1)为什么对象文字不适用于这个特定的例子?我何时使用对象文字类型,何时使用构造函数?

2)构造函数优于对象文字的优势

和3)文字类型对象声明可以做我想做的事情吗?

整个代码

<html>

    <body>
        <script>
            function parent() {
                this.parent_last_name = "khan";
                this.occupation = "business";

            }
            parent.prototype.ask = function() {
                alert("what do you do?");
            }

            function child() {
                this.child_name = "mohsin";
                this.occupation = "student";
            }
            child.prototype = new parent();
            var lol = new child();
            document.write(lol.child_name + " " + lol.parent_last_name);
        </script>
    </body>

</html>

浏览器:Firefox

1 个答案:

答案 0 :(得分:3)

对象文字只是Object的一个实例,而构造函数是Function的实例,当使用new运算符时,它可以成为构造函数背后(即new SomeFunc())。

请记住,函数是JavaScript的第一个公民结构。它们既可以是旧式程序函数,也可以是对象方法,也可以是对象构造函数。

何时使用对象构造函数?简单:当您想要在相同或其他脚本文件中重用相同的对象结构时,您可能需要原型链(继承)。

如果你需要一个对象作为某个函数调用的参数传递或类似的东西,那么 object literals 就是你的选择。

无论如何,无论何时创建函数(无论是否为构造函数),您都可以使用 prototype 定义成员,这些成员将成为使用整个函数创建的任何实例的一部分。自ECMA-Script 5.x起,您还可以使用Object.create(...)

var A = function() {};
A.prototype.doX = function();

Object.create(A.prototype, {
    doY: {
        value: function() { }
    }
});

Object.create方法也是在JavaScript中获取继承的另一种方法,因为它创建了一个对象,其原型是作为整个函数的第一个参数提供的原型。

关于错误......

您无法使用new运算符使用对象文字,这就是为什么Web浏览器(或ECMA-Script运行时...)会抛出错误,因为对象文字是{的一个实例{1}}而不是Object