我在JavaScript/JQuery中做了大量的编程.
但我从未使用过"原型".事实上,我不知道这意味着什么.
当它有用时,你有一个实际的例子吗?
所以我有空对象a = {}.当我这样做console.log(a),console.dir(a)甚至是
for(b in a) {
console.log(b);
}
Run Code Online (Sandbox Code Playgroud)
我不明白看到"隐藏属性",如__defineGetter__,hasOwnProperty等.
如何打印对象的所有属性?
看来这里有区别......
让我们说我们有 function MyConstructor() {}
MyConstructor [[Prototype]]是Function.prototype,而不是 MyConstructor.prototype.
在其他(非标准/"console.log-able")字样中:
MyConstructor.__ proto__ 不是 MyConstructor的MyConstructor.prototype
试试这个:
function MyConstructor() {};
(MyConstructor.__proto__ === MyConstructor.prototype); //false?! why?
Run Code Online (Sandbox Code Playgroud)
为什么会这样?有人能解释一下这个区别吗?
我正在使用名为 vLine 的 js API 制作工具,但这是 javascript 的基本问题,所以我在这里发布。
我想在示例代码上附加聊天系统。我在/// 聊天功能之间添加了什么
但
this.prototype.onMessage_
Run Code Online (Sandbox Code Playgroud)
显示错误,例如
Uncaught TypeError: Cannot set property 'onMessage_' of undefined
Run Code Online (Sandbox Code Playgroud)
我已经编写了一些 javascript 程序,但我不擅长这个。所以我想我不明白一些非常基本的面向对象的JavaScript。
请帮我。
<script>
var vlineClient = (function(){
if('{{vlineData.serviceId}}' == 'YOUR_SERVICE_ID' || '{{vlineData.serviceId}}' == 'YOUR_SERVICE_ID'){
alert('Please make sure you have created a vLine service and that you have properly set the $serviceID and $apiSecret variables in classes/Vline.php file.');
}
var client, vlinesession,
authToken = '{{ vlineData.authToken }}',
serviceId = '{{ vlineData.serviceId }}',
profile = {"displayName": '{{ …Run Code Online (Sandbox Code Playgroud) [首先,这个问题可能与JavaScript .prototype如何工作有相同的概念?,但有不同的背景.]
我看到这个博客说:
在JavaScript中,每个对象都有一个名为"prototype"的属性.对象的原型允许我们向该对象的所有实例添加属性(甚至是现有实例).
根据我到目前为止的理解,上述陈述对于初学者来说是令人困惑的,因为它没有区分"原型"和"[[原型]]".并非所有对象都具有prototype属性,例如:
var myobject = {};
myobject.prototype; // Undefined
Run Code Online (Sandbox Code Playgroud)
我想如果我们说:
在JavaScript中,每个对象都有一个名为"[[Prototype]]"的内部属性,在某些浏览器中可以通过访问名为"__proto__"的非标准属性来查看.对象的原型允许我们向该对象的所有实例添加属性(甚至是现有实例).只有函数(因此构造函数)具有'prototype'属性来设置,允许我们向该函数/构造函数的所有对象实例添加属性.
这是对JavaScript原型的更准确的描述,还是我错过了什么?提前致谢.
我正在尝试使用node.js和其他相关技术来实现应用程序.从java土地多态性开始但是很自然,但对于经典程序员节点的工作方式不同.
应用程序将在用户提供的运行时加载新代码.为了让主要核心使用这个代码"我们"需要就某种约定达成一致.知道新节点是什么我并不感到惊讶,因为我找不到答案.问题是这个问题在JS中也相当模糊.
要求:
更新:
我不仅仅是一个后端人而不是前端人,但JavaScript让我很感兴趣.我试图围绕我看来是多种不同的对象建模方法.
在过去的几年里,我一直主要编写与此类似的代码(假设加载了jQuery):
var TicketForm = {
elements: ['input', 'textarea', 'select', 'checkbox'],
enable: function(form) {
this.elements.forEach( function(el) {
form.find(el).prop('disabled', false);
});
},
disable: function(form) {
this.element.forEach( function(el) {
form.find(el).prop('disabled', true);
});
}
};
Run Code Online (Sandbox Code Playgroud)
这样我就可以简单地调用TicketForm.enable($('#whatever'));启用一个特定的表单,非常类似于PHP中的静态方法调用.
我最近一直在使用PHP中的闭包,我知道它们在JavaScript中也存在(我正在使用它们).我正在努力更彻底地掌握这个概念.在遇到这个令人惊讶的剧本之后:http://codepen.io/stuffit/pen/KrAwx,我决定尝试模仿该作者的编码风格.只是试图复制他的风格,我重写了我的代码:
var TicketForm = function() {
this.elements = ['input', 'textarea', 'select', 'checkbox'];
};
TicketForm.prototype.enable = function(form) {
this.elements.forEach( function(el) {
form.find(el).prop('disabled', false);
});
};
TicketForm.prototype.disable = function(form) {
this.elements.forEach( function(el) {
form.find(el).prop('disabled', true);
});
};
Run Code Online (Sandbox Code Playgroud)
但是,当我TicketForm.enable($('#whatever'));在这种情况下打电话时,我收到错误
Uncaught TypeError: Object …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
function Rune(){
this.subSpells = [];
}
function Modifier(){
this.type = "modifier";
}
Modifier.prototype = new Rune();
function RuneFactory(effect, inheritsFrom, initialValue){
var toReturn = function(){};
toReturn.prototype = new inheritsFrom();
toReturn.prototype.subSpells[effect] = initialValue;
return toReturn;
}
Duration = RuneFactory("duration", Modifier, 1);
Quicken = RuneFactory("quicken", Modifier, 1);
x = new Duration();
y = new Quicken();
Run Code Online (Sandbox Code Playgroud)
x.subSpells.duration和x.subSpells.quicken都等于1.与y相同.我希望x.subSpells.quicken和y.subSpells.duration未定义.
如果我为Duration和Quicken定义执行以下操作,我会得到我想要的行为.
Duration = RuneFactory("duration", Rune, 1);
Quicken = RuneFactory("quicken", Rune, 1);
Run Code Online (Sandbox Code Playgroud)
我认为双重继承存在问题.任何人都可以告诉我如何更改我的RuneFactory代码,使其适用于双重继承和/或解释什么是破坏?如果可能的话,我想避免使用框架.
谢谢!
var x = {
name: "japan",
age: 20
}
x.prototype.mad = function() {
alert("USA");
};
x.mad();
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用。对象字面量不能扩展?或x.mad()呼叫方式不正确。
function Candy(name) {
this.name = name;
}
Candy.prototype.printName = function () {
console.log(this.name);
}
var chocolate = new Candy("chocolate");
chocolate.printName();
var gummyBears = new Candy("gummy bears");
gummyBears.printName();
Run Code Online (Sandbox Code Playgroud)
这与不使用原型完全相同:
function Candy(name) {
this.name = name;
this.printName = function () {
console.log(this.name);
}
}
var chocolate = new Candy("chocolate");
chocolate.printName();
var gummyBears = new Candy("gummy bears");
gummyBears.printName();
Run Code Online (Sandbox Code Playgroud)
所以我不确定使用原型的优势是什么!