javascript - 我如何使用对象字面量模式代替构造函数

标签 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>

浏览器:火狐

最佳答案

对象字面量只是Object的实例,而构造函数是Function的实例,当时,它可以成为构造函数>new 运算符在其后面使用(即 new SomeFunc())。

请记住,函数是 JavaScript 的首要构造。它们可以是老式的过程函数、对象方法,也可以是对象构造函数。

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

如果您需要将对象作为某些函数调用或类似内容的参数传递,对象文字就是正确的选择。

无论如何,每当您创建一个函数(无论是否是构造函数)时,您都会有一个原型(prototype)可用于定义成员,这些成员将成为使用整个函数创建的任何实例的一部分。从 ECMA-Script 5.x 开始,您还可以使用 Object.create(...):

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

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

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

关于错误...

您不能使用 new 运算符来使用对象字面量,这就是 Web 浏览器(或 ECMA-Script 运行时...)会抛出错误的原因,因为对象字面量是对象而不是函数

关于javascript - 我如何使用对象字面量模式代替构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23935256/

相关文章:

Javascript正则表达式限制用户在文本字段中输入相同的连续数字

javascript - 如何将html div复制到另一个div而不显示none div

c# - 为什么我可以在另一个实例上调用私有(private)方法而不是它自己

java - 关于通过java实现的反射的工厂设计模式

javascript - jQuery 固定侧边栏在溢出时随内容移动

javascript - 在 Javascript 中设置 Canvas 大小

javascript - jQuery 验证插件在两个提交按钮中工作

c# - 强制 C# 方法只传递正参数?

PHP面向对象结构

java - 在此示例中,lambdas 和引用方法如何工作?