关于构造函数在Javascrpt中的工作原理,我感到非常困惑.尽管使用该语言已有好几年了(大多数情况下它就像是LISP的半命令版本),但我想更多地了解对象应该如何工作.
鉴于此代码:
function Foo(x) {
return {
bar: function() { return x; }
};
}
Run Code Online (Sandbox Code Playgroud)
打电话myFoo = Foo(5)和有myFoo = new Foo(5)什么区别?或者,换句话说,Javascript中的构造函数究竟是做什么的?
我试图扩展代理,如下:
class ObservableObject extends Proxy {}
Run Code Online (Sandbox Code Playgroud)
我使用Babel将其转换为ES5,我在浏览器中收到此错误:
app.js:15 Uncaught TypeError: Object prototype may only be an Object or null: undefined
Run Code Online (Sandbox Code Playgroud)
我查看了它指向的代码行.这是代码的一部分,箭头指向有问题的代码行:
var ObservableObject = exports.ObservableObject = function (_Proxy) {
_inherits(ObservableObject, _Proxy); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
function ObservableObject() {
_classCallCheck(this, ObservableObject);
return _possibleConstructorReturn(this, Object.getPrototypeOf(ObservableObject).apply(this, arguments));
}
return ObservableObject;
}(Proxy);
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么我可能会收到此错误?这是巴贝尔的错误吗?当您尝试扩展代理时应该发生什么?
如果我在构造函数中返回一些值或对象,var会得到什么?
function MyConstroctor()
{
//what in case when return 5;
//what in case when return someObject;
}
var n = new MyConstroctor();
Run Code Online (Sandbox Code Playgroud)
在这两种情况下会得到什么?
实际上它是一个测验问题,答案是什么?
从自定义对象构造函数返回什么?
a)新实例化的对象
b)未定义 - 构造函数不返回值
c)返回语句
是什么d)返回语句是什么; 如果没有return语句,则新实例化的对象
如果我有这样的功能:
function Apple(){
this.color = "green";
return this;
}
Run Code Online (Sandbox Code Playgroud)
在创建这样的对象时:
var my_obj = new Apple();
Run Code Online (Sandbox Code Playgroud)
该行是return this;必要的和/或是否通过语言参考有效?
我停了一会儿,不知道哪里出错,请帮帮我
这是错误消息:
Warning: App(...): No `render` method found on the returned component instance: you may have forgotten to define `render`.
Uncaught TypeError: inst.render is not a function
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
import React from 'react';
import ReactDOM from 'react-dom';
console.log('Start')
export class App extends React.Component{
constructor(props) {
super(props);
console.log('getInitialState');
return { status:true }
}
toggleState(){
this.setState({status: !this.state.status})
}
render() {
console.log('render');
return (
<div>
<h1 onClick={this.toggleState}>Hello</h1>
</div>
);
}
}
ReactDOM.render(<App name='Vipul' />,document.getElementById('app'));
Run Code Online (Sandbox Code Playgroud) 当JavaScript函数用作新对象的构造函数(带有'new'关键字)时,返回语句在JavaScript函数体中的作用是什么?
John Papa将AngularJS的"控制器为"技术描述为:
myApp.controller("MainCtrl", [
function () {
var vm = this; // convention - ViewModel
vm.person = { name: "Bob" };
return vm;
}]);
Run Code Online (Sandbox Code Playgroud)
这条return vm;线的目的是什么?代码在没有它的情况下工作
使用内置的JavaScript对象和构造函数,我注意到有点奇怪的东西.
有时,可以通过调用构造函数来获取新对象new.例如:
> new Array(1,2,3,4)
[1, 2, 3, 4]
> Array(1,2,3,4)
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
但有时这不起作用:
> Date()
"Thu Jun 05 2014 00:28:10 GMT-0600 (CST)"
> new Date()
Date 2014-06-05T06:28:10.876Z
Run Code Online (Sandbox Code Playgroud)
是否在ECMAScript规范中的任何位置定义了非新构造函数内置函数的行为?请注意,此行为实际上很有用; 我可以通过调用来制作一个非稀疏的数组副本Array.apply(arr),但如果它是跨平台的话,我只会觉得这样做很舒服.
我问这个问题是因为我注意到 TypeScript 允许声明返回原始类型的构造函数,例如:
type Constructor1 = new () => string; // Primitive string
Run Code Online (Sandbox Code Playgroud)
相对于
type Constructor2 = new () => String; // String object
Run Code Online (Sandbox Code Playgroud)
这让我想知道 JavaScript 是否真的允许创建一个在使用语义调用时返回原始值的函数,即通过原始性测试的new值:
type Constructor1 = new () => string; // Primitive string
Run Code Online (Sandbox Code Playgroud)
不用说,我找不到任何生成原始值的构造函数调用的示例,因此我想这一定是 TypeScript 类型模型的另一个奇怪之处。或者原始构造函数真的存在吗?
作为参考,这是我尝试过的。
预定义的构造函数Number、Boolean、String等在使用 调用时都会生成一个对象new,尽管它们在作为常规函数调用时返回一个原始值。IE
type Constructor2 = new () => String; // String object
Run Code Online (Sandbox Code Playgroud)
function isPrimitive(value) {
return value !== Object(value);
}
Run Code Online (Sandbox Code Playgroud)
return在构造函数中语句return会覆盖构造函数中的实例this,但前提是返回值是对象: …
我目前正在研究在JavaScript中构建类的不同模式.但不管我看到什么模式,还有一些我不太确定的事情.
var ItemManager = (function()
{
var p = function()
{
this.items= [];
};
p.prototype.addItem = function(item)
{
var self = this;
self.items.push(item);
};
return p;
}());
Run Code Online (Sandbox Code Playgroud)
我创建了简单的类ItemManager,这个类得到了addItem函数,用于将任何项添加到集合中.现在我真的不希望表示集合的变量项是公共的,这个变量应该是私有的,但我没有看到任何可能的方法来使用prototyped方法来访问私有变量.
那么这种情况下的最佳做法是什么?只是不使用私有变量?
javascript ×9
constructor ×2
ecmascript-6 ×2
oop ×2
angularjs ×1
babeljs ×1
class ×1
controller ×1
es6-proxy ×1
new-operator ×1
primitive ×1
reactjs ×1
return ×1
standards ×1