我试图理解链接函数在JavaScript中是如何工作的.我有两个例子:
第一
class Arithmetic {
constructor() {
this.value = 0;
}
add(value) {
this.value = this.value + value;
return this;
}
subtract(value) {
this.value = this.value - value;
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过实例化let a = new arithmetic();和链接方法a.add(3).subtract(4);
第二
var zappo = function(selector) {
var el;
var obj = {
getEl(selector) {
return document.querySelector(selector);
},
addClass(className){
el.classList.add(className);
return this;
}
}
el = getEl(selector);
return obj;
}
Run Code Online (Sandbox Code Playgroud)
我可以通过链接这些方法 zappo(#main).addClass("green").addClass("red");
我的问题是为什么第一个构造函数能够在没有对象内的方法的情况下链接函数,而第二个函数需要所有方法都在一个对象中?
如果我想为传递给函数的每个解构参数分配不同的类型,而不是统一的类型,那么格式应该是什么?
例如,如果我希望所有三个变量都是字符串,则它将采用以下格式:
const Auth = ({ history, match, path }: string) => {
//content
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我希望第一个是对象,第二个是字符串,第三个是数组怎么办?
我有以下解构:
const {
user: {
username,
image,
uid
} = {},
gallery: {
image: picture,
} = {},
} = data
Run Code Online (Sandbox Code Playgroud)
问题是gallery有时null(不是picture内部gallery),即使我需要的是picture内部gallery存在时。换句话说,gallery: null,不是gallery.image: null。
因此,我得到:
null 不是对象
的错误消息gallery.image。
我如何有条件地解构以便gallery.image在它存在时使用它,但gallery在为空时不解构?
我很难理解convert(_:to:)和之间的区别convert(_:from:)由于某种原因,
假设我有两种观点(superView和subview)和一个根视图:
let superView = UIView(frame: CGRect(origin: .init(x: 25, y: 25), size: CGSize(width: 100, height: 100)))\nrootView.addSubview(view)\n\nlet subview = UIView(frame: CGRect(origin: .init(x: 25, y: 25), size: .init(width: 50, height: 50)))\nsuperView.addSubview(subview)\nRun Code Online (Sandbox Code Playgroud)\nconvert(_:to:)根据文档,将接收器\xe2\x80\x99s 坐标系中的点转换为指定视图的点:
let convertToWindow = subview.convert(subview.bounds, to: window)\n// {x 50 y 50 w 50 h 50 }\nRun Code Online (Sandbox Code Playgroud)\nconvert(_:from:)根据文档,将给定视图的坐标系中的点转换为接收器的坐标系:
let convertFromWindow = subview.convert(subview.bounds, from: window)\n// {x -50 y -50 w 50 h …Run Code Online (Sandbox Code Playgroud) 假设您有一个超级视图,其尺寸小于其子视图。您将clipsToBound超级视图的属性设置为false。如果点击子视图超出父视图边界的突出区域,为什么命中测试返回 nil?
我的理解是,命中测试从子视图开始,一直到超级视图。那么为什么晚于子视图测试的父视图的属性很重要呢?或者命中测试是否从根开始到树视图(例如视图控制器 -> 主视图 -> 子视图)?
我从这里找到了一个自定义命中测试,它确实允许您点击超级视图边界之外的子视图区域,但我不确定为什么反转子视图的顺序会产生影响(它有效,我是只是不知道为什么)。我的示例甚至只有一个子视图。
class ViewController: UIViewController {
let superview = CustomSuperview(frame: CGRect(origin: .zero, size: .init(width: 100, height: 100)))
let subview = UIView(frame: CGRect(origin: .zero, size: .init(width: 200, height: 200)))
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(self.superview)
self.superview.backgroundColor = .red
self.superview.clipsToBounds = false
self.superview.addSubview(self.subview)
self.subview.backgroundColor = .blue
let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
self.subview.addGestureRecognizer(tap)
}
@objc func tapped(_ sender: UIGestureRecognizer) {
print("tapped")
}
}
class CustomSuperview: UIView {
override func hitTest(_ …Run Code Online (Sandbox Code Playgroud) javascript ×3
ios ×2
reactjs ×2
swift ×2
constructor ×1
ecmascript-6 ×1
function ×1
hittest ×1
object ×1
objective-c ×1
touch-event ×1
typescript ×1
uiview ×1