最近我开始学习Javascript,因为我来自Java世界.我得到了这本名为JavaScript The Definitive guide的书..我现在对Prototypes和Inheritance有点困惑.我想知道将函数设置为对象属性和函数原型之间有什么区别.从书中的例子:
function Rectangle(w, h) {
this.width = w;
this.height = h;
this.area = function( ) { return this.width * this.height; }
}
Run Code Online (Sandbox Code Playgroud)
使用这个新版本的构造函数,您可以编写如下代码:
// How big is a sheet of U.S. Letter paper in square inches?
var r = new Rectangle(8.5, 11);
var a = r.area( );
Run Code Online (Sandbox Code Playgroud)
此解决方案效果更好,但仍然不是最佳的(为什么).创建的每个矩形都有三个属性(是的,那么什么?).每个矩形的宽度和高度属性可能不同,但每个Rectangle对象的区域总是引用相同的函数(当然,有人可能会更改它,但您通常希望对象的方法保持不变).对于打算由同一个类的所有对象共享的方法使用常规属性是低效的(为什么问题是什么?)(即,使用相同构造函数创建的所有对象).
<script>
var person = function () {
// Private
var name = "David";
return {
getName : function () {
return name;
},
setName : function (newName) {
name = newName;
}
};
}();
console.log(person.name);
</script>
Run Code Online (Sandbox Code Playgroud)
题:
为什么它显示:在控制台中未定义?
阅读可以使用哪些技术在JavaScript中定义一个类,以及它们的权衡取舍是什么?在stackoverflow上我明白我可以通过定义一个类
方法1:
function Person(name, gender){
this.name = name;
this.gender = gender;
}
Run Code Online (Sandbox Code Playgroud)
并在原型中添加函数,以避免每次实例化时重新创建成员函数.喜欢
Person.prototype.speak = function(){
alert("my name is" + this.name);
}
Run Code Online (Sandbox Code Playgroud)
并通过创建其实例
var person = new Person("Bob", "M");
Run Code Online (Sandbox Code Playgroud)
我认为使用新的关键字就可以创建相同的对象
方法2:
var Person = function (name, gender) {
return {name:name, gender:gender};
}
person = Person("Bob", "M");
Run Code Online (Sandbox Code Playgroud)
第二种方法是否完成了第一种方法完成相同的操作?如果是这样的话,我将如何在第二种方法中通过原型模拟添加函数(正如我们在方法1中所说的那样)?
如何让最后一行工作?
function Animal(name){
this.name = name;
}
Animal.prototype.speak = function(){
alert('Hi, I\'m ' + this.name);
}
function Dog(name){
this.name = name;
}
Dog.prototype.bark = function(){
alert('Woof!');
};
var fido = new Dog('Fido');
fido.bark(); // Woof!
fido.speak(); // Hi, I'm Fido *can't get this to work*
Run Code Online (Sandbox Code Playgroud) 我一直在做很多HTML和CSS,现在我正在做一个JS教程.我遇到了这个问题.我不知道如何访问原型.
说明:
使用两个属性创建一个名为Animal的类,
name并且numLegs.Animal构造函数应该有两个参数,其值分配给name和numLegs.接下来,更改Animal的原型并添加一个方法sayName,该方法打印到控制台"我的名字是
[name]",其中[name]是name的值.点击"坚持?获得提示!" 有关如何创建类以及如何将方法添加到对象原型的示例.
最后,我们提供了最后两行来测试你的构造函数和
sayName方法.不要改变这些!
这是我的代码:
// create your Animal class here
function Animal(name, numLegs)={
this.name=name;
this.numLegs=numLegs;
this.sayName=function(){
console.log("Hi, my name is "+this.name);
}
}
// create the sayName method for Animal
// provided code to test above constructor and method
var penguin = new Animal("Captain Cook", 2);
penguin.sayName();
Run Code Online (Sandbox Code Playgroud)
我收到语法错误.是什么赋予了?