小编Joh*_*isz的帖子

为什么可以通过引用从外部类访问私有变量?

如果我有一个返回对不可见(私有或受保护)属性的引用的公共类方法,我可以使用该引用来获得直接访问:

PHP代码

class A
{
    private $property = 'orange';

    public function &ExposeProperty()
    {
        return $this->property;
    }

    public function Output()
    {
        echo $this->property;
    }
}

$obj = new A();

# prints 'orange'
$obj->Output();

$var = &$obj->ExposeProperty();
$var = 'apple';

# prints 'apple'
$obj->Output();
Run Code Online (Sandbox Code Playgroud)

PHP 中的此功能背后是否有原因?还是只是设计上的疏忽,未能通过引用跟踪访问冲突?

当您想要实现以下目标时,它显然会派上用场:

PHP代码

$this->load->resource();
Run Code Online (Sandbox Code Playgroud)

哪里load是修改给定属性的对象$this。但是除了这个快捷方式,我没有看到很多可能的用途,否则有效的 OOP 模式是不可能的。

php oop

5
推荐指数
1
解决办法
534
查看次数

将类作为参数并返回该类的实例的函数的类型

我有一个实例化器函数,它返回所提供类的一个实例:

declare type ClassType = { new (): any }; // alias "ParameterlessConstructor"

function getInstance(constructor: ClassType): any {
    return new constructor();
}
Run Code Online (Sandbox Code Playgroud)

我怎么可能让这个函数返回一个实例中的 constructor 参数,而不是any,让我可以实现类型安全,为消费者这个功能呢?

typescript

5
推荐指数
1
解决办法
607
查看次数

使用webpack创建连接的.d.ts

我希望使用以下自动步骤构建我的TypeScript项目(在Visual Studio中):

  1. 将每个.ts文件分别编译为AMD模块
  2. 将每个创建的.js文件与webpack 捆绑在一起release/my-app.js

作为步骤1的一部分,.d.ts还为每个.ts文件创建文件(除了输出Javascript文件).我如何将这些定义文件捆绑在一起,以便它们为捆绑到my-app.js输出文件中的内容提供类型定义?


项目布局

MyApp
|-- lib
|   |-- foo.ts
|   |-- foo.js
|   |-- foo.d.ts
|   `-- ...
|-- release
|   `-- my-app.js
|-- main.ts
|-- main.js
|-- main.d.ts
`-- webpack.config.js
Run Code Online (Sandbox Code Playgroud)

webpack.config.js

module.exports = {
    context: __dirname,
    entry: './main.js',
    output: {
        path: path.join(__dirname, 'release'),
        filename: 'my-app.js'
    }
}
Run Code Online (Sandbox Code Playgroud)

javascript typescript webpack

5
推荐指数
1
解决办法
604
查看次数

属性装饰器仅适用于特定属性类型

我在TypeScript中有一个属性装饰器,只能在类型的属性上使用Array.要强制执行此操作,TypeError如果属性类型不是,则在运行时抛出a Array(使用反射元数据获取属性类型信息):

function ArrayLog(target: any, propertyKey: string) {
    if (Reflect.getMetadata("design:type", target, propertyKey) !== Array) {
        throw new TypeError();
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,我不会认为这太开心了.我怎么能这样做,以便TypeScript编译器允许在某种类型的属性上使用某个属性装饰器?

decorator typescript

5
推荐指数
1
解决办法
820
查看次数

确定对象是否是通用基类的实例,任何通用类型

我需要测试一个值是否是通用基类的实例,而又不知道通用类型参数。使用MSDN示例作为示例的基础,这是我要完成的任务:

using System;

public class Class1<T> { }
public class DerivedC1 : Class1<int> { }

class IsSubclassTest
{
   public static void Main()
   {
      Console.WriteLine(
          "DerivedC1 subclass of Class1: {0}",
          typeof(DerivedC1).IsSubclassOf(typeof(Class1<>)) // <- Here.
      );
   }
}
Run Code Online (Sandbox Code Playgroud)

尽管从语法上讲这是正确的,但始终会产生错误。如果删除通用类型参数,它将按预期工作(返回true)。

如何在不知道类通用类型参数的情况下,测试类类型是否是通用基类的子类?

c# reflection

5
推荐指数
3
解决办法
1893
查看次数

为什么在反应 jsx 中使用时 if-else 条件不起作用

在编写反应代码时在 jsx 中编写 if-else 不起作用。

<div id={if (condition) { 'msg' }}>Hello World!</div>
Run Code Online (Sandbox Code Playgroud)

但是使用三元运算符有效。

<div id={condition ? 'msg' : null}>Hello World!</div>
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

javascript jsx reactjs react-jsx

5
推荐指数
1
解决办法
3799
查看次数

使用指定的对象键从对象数组快速创建对象映射

我有一组统一的对象:

var objects = [{
    id: 1,
    name: "one"
}, {
    id: 2,
    name: "two"
}];
Run Code Online (Sandbox Code Playgroud)

我通过使用id每个对象的属性作为 Map 键将它们转换为 Map:

var map = new Map();

objects.forEach(obj => map.set(obj.id, obj));
Run Code Online (Sandbox Code Playgroud)

但是,我想在没有以下情况下进行转换:

  1. 必须自己手动创建一个新的地图对象,并且
  2. 必须手动遍历数组并调用set自己

此外,我不觉得我应该为这个可能是原生的功能创建一个实用程序函数。

注意:搜索js array to map,或js convert array to map,或js map from array 的搜索查询都被石器时代的答案 withObject或具有实用功能的解决方案所困扰。我找这里原生的做法。

例如,我正在寻找在 C# 中将数组映射到字典的本机 JavaScript 等效项。

var map = list.ToDictionary(item => item.id);
Run Code Online (Sandbox Code Playgroud)

这非常简单和方便,但有趣的是Map.from,JavaScript 中没有(即使有Array.from)。

javascript ecmascript-6

5
推荐指数
1
解决办法
8725
查看次数

在Javascript中从选定区域获取元素

我需要在 Javascript 中实现从选定区域获取元素。这是在 chrome 应用程序中制作更好的、类似桌面的 UI 所必需的。最近的例子是在 Imgur 扩展中选择区域:

截屏

所以问题是:

  1. 这个选择如何在javascript中完成?
  2. 如何从这个选择中获取元素?

javascript google-chrome-extension imgur html5-canvas

4
推荐指数
1
解决办法
4992
查看次数

调试时使用函数调用语句作为异常原点

我在我的单元测试中使用以下小实用程序来比较一些对象:

static class ObjectAssert
{
    public static void AreSimilar(object expected, object actual, string message)
    {
        var serializer = new JavaScriptSerializer();

        if (serializer.Serialize(expected) != serializer.Serialize(actual))
        {
            throw new AssertFailedException(message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,它是所有序列化expectedactual成JSON,然后比较所得到的字符串,这使得它容易比较对象的公共可见部分.我这样使用它:

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
public void UnitTest1()
{
    var expected = new Person() { FirstName = "John", LastName = "Doe" };
    var actual = new Person() { FirstName = "John", …
Run Code Online (Sandbox Code Playgroud)

c# exception-handling

4
推荐指数
1
解决办法
67
查看次数

如何声明/忽略缺少的JSX类型?

我想在文件中使用SVG use元素.tsx

<mask id="mask1">
    <use ... />
</mask>
Run Code Online (Sandbox Code Playgroud)

我将其直接转换为React调用。但是,我一直收到以下错误:

类型“ JSX.IntrinsicElements”上不存在属性“ use”。

Visual Studio 2015社区版

我相信标准的lib定义中缺少此元素。如何声明此类型以供TypeScript编译器查看,类似于如何声明类或变量?通常declare vardeclare class语句均无效。

如果不可能,如何使TypeScript编译器忽略此错误?

jsx typescript

4
推荐指数
5
解决办法
3643
查看次数