我不是那种动态编程语言,但是我写了很多JavaScript代码.我从来没有真正了解这个基于原型的编程,有没有人知道这是如何工作的?
var obj = new Object();
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();
Run Code Online (Sandbox Code Playgroud)
我记得很久以前我和人们进行了很多讨论(我不确定我在做什么)但是据我所知,没有一个类的概念.它只是一个对象,这些对象的实例是原始的克隆,对吧?
但是JavaScript中这个".prototype"属性的确切目的是什么?它与实例化对象有什么关系?
var obj = new Object(); // not a functional object
obj.prototype.test = function() { alert('Hello?'); }; // this is wrong!
function MyObject() {} // a first class functional object
MyObject.prototype.test = function() { alert('OK'); } // OK
Run Code Online (Sandbox Code Playgroud)
这些幻灯片也非常有帮助.
我想在a中实现常量class,因为在代码中找到它们是有意义的.
到目前为止,我一直在使用静态方法实现以下解决方法:
class MyClass {
static constant1() { return 33; }
static constant2() { return 2; }
// ...
}
Run Code Online (Sandbox Code Playgroud)
我知道有可能摆弄原型,但许多人建议不要这样做.
有没有更好的方法在ES6类中实现常量?
我用OOP语言编程已超过10年,但我现在正在学习JavaScript,这是我第一次遇到基于原型的继承.通过学习优秀的代码,我倾向于学得最快.什么是正确使用原型继承的JavaScript应用程序(或库)的精心编写的示例?您能否(简要地)描述原型继承的使用方式/原因,我知道从哪里开始阅读?
了解如何在构造函数中声明x和y:
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在函数之外声明属性,例如:
class Point {
// Declare static class property here
// a: 22
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
Run Code Online (Sandbox Code Playgroud)
所以我想分配给22,但我不确定我是否可以在构造函数之外做但仍然在类中.
我想为道具添加一些规则:
import React, { Component } from 'react'
export default class App extends Component {
static propTypes = { name: React.PropTypes.string.isRequired };
render() {
return(
)
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到了一个错误:
Warning: Failed prop type: Required prop `name` was not specified in `App`.
Run Code Online (Sandbox Code Playgroud)
我有这个配置为babel:
{
"presets": ["es2015", "react"],
"plugins": ["transform-runtime", "transform-class-properties"]
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
UPD.更改代码:使用static
这将是一个相对较长的问题,但我真的很想理解.最后的问题在问题的底部提出.
我已经阅读了这个问题的答案:
ES6类可变替代品
关于为什么在ES6中不接受这种语法的问题:
class MyClass {
const MY_CONST = 'string';
constructor(){
this.MY_CONST;
}
}
Run Code Online (Sandbox Code Playgroud)
1)第一个答案提到:
请记住,类定义定义了原型方法 - 在原型上定义变量通常不是你做的事情.
我不明白这个; 基于类的语言中的静态变量似乎与JS中原型上定义的属性具有相同的目的.
显然不是像人名这样的实例变量,但它可以是车辆的默认MAX_SPEED,或者是所有实例共享的计数器.如果实例未覆盖原型的MAX_SPEED,则返回默认值.这不是静态变量的确切目的吗?
2)以下帖子(ES6规范提案)制定:
(故意)没有直接声明方式来定义原型数据属性(方法除外)类属性或实例属性.需要在声明之外创建类属性和原型数据属性.
我没有看到在类本身(构造函数之外)中使用默认值声明/初始化实例/类变量的实际区别?如果它在原型上有什么关系?如果它涉及一个具有默认值的实例变量,该默认值可能适用于所有实例(但仍可覆盖),我看不出有什么问题.那究竟是什么意思呢?
3)关于ES6类变量替代问题的第二个答案让我感到困惑(尽管不是技术专家).
从类方法中可以将变量作为
this.constructor.foo(或MyClass.foo)访问 .通常无法从类实例访问这些类属性.即
MyClass.foo让"酒吧",但new MyClass().foo为undefined
这表明显然可以在类(或底层函数)上声明一个类变量,如本例所示:http://www.es6fiddle.net/iehn0hxp/
class Car{
constructor(){
//Set instance variable
this.instance_var = 220;
//Set class variable
this.constructor.class_var = 240;
}
}
var Mercedes = new Car();
var Audi = new Car();
//Instance property
console.log(Mercedes.instance_var); //220
//Class property …Run Code Online (Sandbox Code Playgroud) 用const声明的函数与不使用let或const声明的函数与在ES6类中否则声明的函数之间有什么区别?
class App extends Component {
submitFood = () =>{
// some code
}
Run Code Online (Sandbox Code Playgroud)
上面的为什么可以正常工作,但是下面的声明给出了错误:
class App extends Component {
const submitFood = () =>{
// some code
}
Run Code Online (Sandbox Code Playgroud) 我正在构建一个静态类来将数据存储在一个数组中,我想声明一个静态变量,但我不知道如何在 javascript 上执行此操作。
JS代码:
class GCache {
// Define cache variable
static cache = {}; // <--- that is what i don't know how to do
/**
* Check if data is on cache
* @param {*} id
*/
static isOnCache(id){
return this.cache.hasOwnProperty(id);
}
/**
* Add data to cache
* @param {*} id
* @param {*} json
*/
static addToCache(id, json){
if(this.isOnCache(id)) return;
this.cache[id] = json;
}
/**
* Obtain data from cache
* @param {*} id
*/
static …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习如何使用 Google Map 或 BrainTree Dropin UI 等 3rd 方 API,并将它们制作成 ReactJS 组件。
在我的研究过程中,我遇到了这样一个包含 Braintree(支付网关)的项目示例 - https://github.com/Cretezy/braintree-web-drop-in-react/blob/master/src/index。 js
不幸的是我无法理解代码,特别是我无法理解第 22-23 行中的语法。它们看起来像装饰器,但我不确定和/或它们在这种情况下如何工作。
我们非常清楚地知道class的ES6也带来了:static,get以及set功能:
但是,似乎static关键字仅保留给方法:
class Person {
// static method --> No error
static size(){
}
// static attribute --> with Error
static MIN=10;
}
Run Code Online (Sandbox Code Playgroud)
如何static在ES6类中编写属性以获得类似静态属性的内容MIN.
我们知道我们可以在类定义后添加以下指令:
Person.MIN=10;
Run Code Online (Sandbox Code Playgroud)
但是,我们的范围是找到在类块中编写此指令的方法
我有一个包含字符串和变量的类:
class Number extends Component{
var num = 8
render(){
return{
<Text>The number is: </Text> + num
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误
Unexpected token (31:6)
var num = 8
^
Run Code Online (Sandbox Code Playgroud)
有什么方法可以让类在使用时同时返回文本和变量?
<Number/>
Run Code Online (Sandbox Code Playgroud) class SomeClass {
someMethod() {
// some code
}
someMoreMethod() {
// some more code
}
}
var someInstance = new someClass();
Run Code Online (Sandbox Code Playgroud)
我们知道,在上面的代码,方法someMethod和someMoreMethod将得到重视的原型someInstance对象.但是,如果我们想要将一些属性(而不是方法)附加到原型上,该怎么办?我尝试执行以下操作,但它会抛出错误:
class SomeClass {
someProperty = "Some Value";
someMethod() {
// some code
}
someMoreMethod() {
// some more code
}
}
Run Code Online (Sandbox Code Playgroud) javascript ×10
ecmascript-6 ×7
reactjs ×3
class ×2
attributes ×1
babel ×1
constants ×1
es6-class ×1
oop ×1
react-native ×1
static ×1