通常说每个Javascript对象都有一个prototype属性,但我发现foo.prototype只有foo函数才有值.
在Chrome和Firefox上,obj.__proto__有一个值 - 这是所说的prototype属性吗?但是在IE 9上,它不起作用(有某种方式可以吗?),我认为prototype属性,这意味着obj.prototype应该工作?
我明白这Object.getPrototypeOf(obj)似乎显示了这个prototype属性,但为什么需要一个特殊的方法来获取它?为什么不喜欢person.name,哪个是获取对象的name属性person?
更新:顺便说一句,obj.constructor.prototype似乎有时候是原型,但有时候不是,如下面的代码用Prototypal继承完成而没有构造函数:(这个方法在Harmes和Diaz by Proress 2008的Pro Javascript Design Patterns一书中,p .46)
var Person = {
name: 'default value',
getName: function() {
return this.name;
}
}
var reader = clone(Person);
console.log(reader.getName());
reader.name = "Ang Lee";
console.log(reader.getName());
function clone(obj) {
function F() {};
F.prototype = obj;
return new F;
} …Run Code Online (Sandbox Code Playgroud) 如果我有一个构造函数 Quo
var Quo = function (string) {
this.status = string;
};
Run Code Online (Sandbox Code Playgroud)
然后用一个新的对象 var myQuo = new Quo("confused");
会有什么区别:
Quo.get_status = function () {
return this.status;
};
Run Code Online (Sandbox Code Playgroud)
和
Quo.prototype.get_status = function () {
return this.status;
};
Run Code Online (Sandbox Code Playgroud) 在一篇名为"未来之路"的演讲中,道格拉斯·克罗克福德表示,他不再在他的JavaScript中使用"新",而是将自己从"这个"中解脱出来.他说JavaScript的优点不是原型继承,而是无类继承.他提供了以下片段,这是他如何定义他的对象:
function constructor(init) {
var that = other_constructor(init),
member,
method = function () {
// init, member, method
};
that.method = method;
return that;
}
Run Code Online (Sandbox Code Playgroud)
他解释说:
我有一个函数,它将需要一些值来初始化它.我建议将它作为一个对象,(这样你就可以使用JSON文本来创建新实例).如果你想继承它的东西,你可以调用另一个构造函数; 无论如何,你要创建一个对象并将其放在一个名为"that"的变量中.您将创建所有成员变量(将成为对象的属性,方法变量的属性,将作用于对象的事物......)这些方法将是将关闭初始化值的函数覆盖所有成员变量和所有方法变量.
它也可以使用"this"和"that",但我建议不要.的理由,否则即是,如果不使用"这个"或"是",那么你可以采取任何的功能出来的对象和independantly打电话给他们,他们还是做同样的事情.这样可以提高语言的可靠性.也意味着你可以传递任何这些东西,使用它作为回调而不必绑定任何东西(它变得更可靠).然后,任何需要公开或特权的方法只需将它们附加到对象并返回对象.这是一个非常灵活的模式 - 你可以获得多重继承,你可以获得方面,你可以获得工厂 - 你可以用这个基本模式做很多事情.
为什么此代码段会进行以下分配?
that.method = method
Run Code Online (Sandbox Code Playgroud)
方法有什么用途?它是如何初始化的?以这种方式声明对象的目的是什么?
他的演讲非常笼统,他只花了一分钟时间来讨论这部分内容而没有详细说明他的推理或引用资源.任何人都可以阐明这种编程风格的动机吗?
视频链接:https: //www.youtube.com/watch?v = 3WgVHE5Augc约37分钟开始
我已经在Codeacademy.com上开始了13天的网络编程,并且发现它是一个学习的好地方.但我有时还会误解事情.我总是在w3school.com上查看它们,但这次我找不到我需要的信息.因此,据我所知,首先有两种类型的创建对象:对象文字符号和第二种:对象构造函数.我已经了解到还有方法和函数,但我无法理解如何用对象文字表示法创建方法?在对象构造函数中,我只写:`
var bob = new Object();
bob.age = 30;
bob.setAge = function (newAge)
{
bob.age = newAge;
};
Run Code Online (Sandbox Code Playgroud)
在编写对象文字表示法时,能否告诉我如何做同样的事情.
var bob = {
age: 30
};
Run Code Online (Sandbox Code Playgroud) "JavaScript是世界上最容易被误解的语言"-D.Crockford
我的问题:
我不是在寻找任何语法以及如何进行解释,因为我理解它们的某些部分,只是想以更简单的方式了解这些事情.类比(非技术)或例子会很棒.*
详细说明我问这个问题的原因(如果你愿意,请忽略):
我在过去的六个月里一直在使用JavaScript,当我发现JavaScript是一种基于原型的语言时,我感到非常震惊.
我经历了一些关于如何使用JavaScript并遇到原型和构造函数的Stack Overflow问题.
我学会了它,现在我可以说在构造函数和原型方面我不是一个菜鸟.我熟悉语法.但是我仍然觉得我错过了一些东西而没有深入到这种语言的核心,我有时会感到困惑.
我希望我很清楚.
javascript constructor prototype prototypal-inheritance prototype-programming
注意:
正如答案所说,由于问题和我的评论中描述的一些问题,问题中提出的代码并没有真正实现继承(否则它会成为答案而不是问题......).它可以像预期的那样继承假(甚至不是原型).
摘要
简而言之,使它类似于我们编写一般的OO语言而不是javascript,但保持继承是正确的.
故事
的Object.create是实现原型继承的好方法,但它是一个有点混乱,以一个类型的大脑和新的球迷.
我们可以通过各种方式编写javascript代码,就像我们使用伪经典模式编写其他OO语言一样.因为它是伪经典的,我们必须正确处理javascript的底层原型继承.
我想要找到的是一种可以在类声明上实现伪古典继承的方法.演示代码放在帖子的后面,它按预期工作,但是,有一些烦人的事情:
我无法摆脱return类声明或继承不起作用.
除了传入this类声明以使返回的闭包知道是什么,我没办法this.
我也想摆脱function (instance, _super) {,但还没有一个好主意.
不继承类的静态(自己的属性).
解决方案比现有框架更多的是一些语法糖,一个好的模式是适用的.
该_extends函数:
function _extends(baseType) {
return function (definition) {
var caller=arguments.callee.caller;
var instance=this;
if(!(instance instanceof baseType)) {
(caller.prototype=new baseType()).constructor=caller;
instance=new caller();
}
var _super=function () {
baseType.apply(instance, arguments);
};
definition(instance, _super);
return instance;
};
}
Run Code Online (Sandbox Code Playgroud)
本Abc类:
function Abc(key, …Run Code Online (Sandbox Code Playgroud) 过去在JavaScript中创建"类"时,我这样做了:
function Dog(name){
this.name=name;
this.sound = function(){
return "Wuf";
};
}
Run Code Online (Sandbox Code Playgroud)
但是,我只是看到有人这样做:
var Dog = (function () {
function Dog(name) {
this.name = name;
}
Dog.prototype.sound = function () {
return "Wuf";
};
return Dog;
})();
Run Code Online (Sandbox Code Playgroud)
你可以两种方式做到,还是我做错了?在那种情况下,为什么?那两者在我们最终的结果方面究竟有什么区别?在这两种情况下,我们都可以创建一个对象:
var fido = new Dog("Fido");
fido.sound();
Run Code Online (Sandbox Code Playgroud)
我希望有人能开导我.
我正在开发一个Web应用程序.应用程序变得非常复杂,对于现存的我决定我必须介绍一些oop概念.
原来的js oop对我来说不够原生(我是.net开发人员),它的继承很糟糕.我遇到了http://moo4q.com/看起来很有希望,但似乎相当新鲜.这对我来说是一个很大的风险.
还有哪些oops框架,以增强我的jquery/js开发?
编辑1
我不是在寻找替代jquery的框架,我正在寻找一个框架来扩展它.
谢谢
原型用于声明一类对象的属性和方法.使用原型的一个优点是它节省了内存,因为类的所有实例都指向原型的属性和方法,这样可以节省内存并有效地允许属性被类的所有实例视为静态.
Prototype用于通过原型链接继承.
我的问题很简单.为什么在你可以做的时候根本就使用原型:
function car() {
this.engine = "v8";
}
function mustang() {
// nm, no good way to inherit without using prototypes
}
Run Code Online (Sandbox Code Playgroud)
是对的吗?所以原型的主要目的有三个:
考虑以下:
var o = {foo: 'bar'};
var p = Object.create(o);
Run Code Online (Sandbox Code Playgroud)
如果o是原型的p,又是什么p方面的o?
javascript ×10
prototype ×4
object ×2
class ×1
constructor ×1
ecma262 ×1
inheritance ×1
jquery ×1
oop ×1
types ×1