gpt4 book ai didi

javascript - "privileged"方法调用成员方法问题

转载 作者:行者123 更新时间:2023-11-30 08:14:14 28 4
gpt4 key购买 nike

考虑以下代码:

function Dog()
{
this.foo = function() {};

this.walk = function()
{
if(canWalk())
{
alert('walking');
return;
}

alert('I have no legs!');
}

canWalk = function()
{
this.foo();
return false;
}
}

var instance = new Dog();
instance.walk();

在假设 this 指针指向 Dog 实例的“特权”canWalk() 方法的代码中存在一个错误.它实际上似乎指向让我感到困惑的全局对象!我已经读到,由于闭包,我可以在构造函数的范围内获取对 this 的引用,然后在我的“特权”方法中使用该引用,但这似乎是一种 hack。

我只是勉强掌握了 this 指针在各种上下文中的行为。我知道“附加”到对象的方法将收到指向附加对象的 this 。例如,foo.doStuff() 将有一个指向 foo 实例的 this

令人不安的是,虽然我认为我很聪明并在我的对象上创建“特权”方法,但看起来我实际上是在将函数转储到全局范围内!也许有一个名为 init() 的全局方法(很有可能)来自另一个库或文件,而不是我自己创建的。如果我随后使用称为 init() 的“特权”方法定义了一个漂亮的小封装对象,我将替换其他全局 init() 方法。

我的问题是,创建“特权”方法(以及与此相关的字段)的最佳做法是什么,这些方法的范围仅限于它们打算属于的对象?我的示例对象还有什么其他方法可以提供私有(private)或特权方法,同时还具有适当的范围。我不是在寻找满足要求的模糊解决方案,而是在寻找最佳实践。

最佳答案

不要使用这个。将 var self = this; 放在 Dog 函数的顶部并使用 self。这样,您将始终拥有对 Dog 的“安全”引用。

在您的示例中,this 应该指向 Dog,除非我也遗漏了什么。

至于你的特权方法,你忘记定义变量了。添加 var canWalk;

还有另一种方法:闭包。我举个例子:

function create_dog() {
function canWalk() {
return false;
}
function walk() {
if (canWalk()) {
alert("walking");
return;
}
alert("I have no hands!");
}
return {
"walk": walk // points to the function walk()
}; // this the API of dog, like public functions (or properties)
}
var dog = create_dog();
dog.walk();

现在您不需要thisnew。另外你可以这样做:

function create_dog() {
function canWalk() {
return false;
}
function walk() {
if (canWalk()) {
alert("walking");
return;
}
alert("I have no hands!");
}
var dog = {
"walk": walk
};
return dog;
}
var dog = create_dog();
dog.walk();

因此您可以在您的特权函数中引用dog如果您不打算使用原型(prototype)设计,我会建议您使用闭包方法。

顺便说一句。为避免混淆:

function my_func() {}

var my_func = function () {};

是等价的。如果您在两个函数之间有循环引用并且您想要强制执行先定义后使用,则后者会很有用。

关于javascript - "privileged"方法调用成员方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6312914/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com