我正在尝试学习不同的对象声明类型和继承。在这里,我首先使用对象构造函数声明了一个名为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
答案 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
。